Assembly Binding Redirect: Wie und warum?


125

Dies ist keine Problemfrage, sondern eine allgemeine Verständnisfrage zur Funktionsweise der Assembly Binding Redirect.

Abfragen

  1. Warum zeigt die Bindungsumleitung nur die Hauptversion und nicht die Neben-, Build- und Revisionsnummern?
  2. Ändert sich die alte und neue Version nur, wenn sich die Hauptversion ändert?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>

Es kann jede Version sein, nicht nur die Hauptversion. Zum Beispiel:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Evk

@ Evk: Alle Beispiele, die ich gesehen habe, zeigen nur die Hauptversion.
Nikhil Agrawal

4
Nun, das sind nur Beispiele, und es wird nirgends angegeben, dass dies der einzig mögliche Weg ist.
Evk

Antworten:


165

Warum werden verbindliche Weiterleitungen überhaupt benötigt? Angenommen, Sie haben Anwendung A, die auf Bibliothek B verweist, sowie Bibliothek C der Version 1.1.2.5. Bibliothek B verweist wiederum auf Bibliothek C, jedoch auf Version 1.1.1.0. Jetzt haben wir einen Konflikt, weil Sie zur Laufzeit nicht verschiedene Versionen derselben Assembly laden können. Um diesen Konflikt zu lösen, verwenden Sie möglicherweise die Bindungsumleitung, normalerweise zur neuen Version (kann aber auch zur alten Version sein). Sie tun das , indem Sie die folgenden zu app.config Datei Anwendungs A, unter configuration > runtime > assemblyBindingAbschnitt (siehe hier für ein Beispiel der vollständigen Konfigurationsdatei):

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

Sie können auch eine Reihe von Versionen angeben, die zugeordnet werden sollen:

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

Jetzt verwendet Bibliothek B, die unter Bezugnahme auf C von Version 1.1.1.0 kompiliert wurde, zur Laufzeit C von Version 1.1.2.5. Natürlich sollten Sie besser sicherstellen, dass Bibliothek C abwärtskompatibel ist, da dies sonst zu unerwarteten Ergebnissen führen kann.

Sie können alle Versionen von Bibliotheken umleiten, nicht nur wichtige.


In welche Datei und in welchen Abschnitt gehen diese? Kann jemand bitte einen Link zu einer Quelle wie MSDN oder ähnlichem als Referenz bereitstellen? Denken Sie daran, dass Personen aus allen Bereichen der Suchmaschine auf Ihren SO Q / A-Artikeln landen und Referenzen von entscheidender Bedeutung sind. Ein Mitarbeiter sagte mir, ich solle "einfach eine Assembly-Weiterleitung zu Ihrer Exe-Datei hinzufügen", bevor ich eine Woche in den Urlaub fahre. Ich landete hier und obwohl diese Antwort großartig aussieht, fehlt es an Kontext und Referenz.
tpartee

Gültige Fragen @tpartee, ich habe die Antwort (in Erwartung der Begutachtung durch Fachkollegen) so bearbeitet, dass sie den Konfigurationsabschnitt und einen Link zu docs.microsoft.com/en-us/dotnet/framework/configure-apps/… enthält.
Kobus Smit

1
@AlexanderDerck in der Konfigurationsdatei von Anwendung A - sie haben (soweit mir bekannt ist) keine Auswirkungen auf Konfigurationsdateien von Bibliotheken, außer wenn diese Bibliothek eine Unit-Test-Bibliothek ist und in gewisser Weise vom Unit-Test-Runner "ausgeführt" wird.
Evk

1
@AlexanderDerck Vor ein paar Wochen gab es eine Frage mit vielen positiven Stimmen und sogar Kopfgeldern, die genau das verlangte, aber niemand konnte eine überzeugende Antwort geben - stackoverflow.com/q/48377474/5311735
Evk

1
@CodeEngine publicKeyToken identifiziert Assembly C. Nur signierte Assemblys verfügen über dieses Public-Key-Token, das sie identifiziert. Hier ist eine verwandte Frage, wie Sie dieses Token herausfinden können, wenn Sie Assembly haben: stackoverflow.com/q/3045033/5311735
Evk

55

Wir haben ein Problem mit der verbindlichen Weiterleitung für NewtonSoft.Json festgestellt. Wir haben die Dateiversion in den Win 10-Dateieigenschaften "9.0.1.19813" nachgeschlagen, die Nummer nachgeschlagen und die Umleitung ist weiterhin fehlgeschlagen. Weitere Untersuchungen ergaben, dass wir uns mit der Dateiversion und nicht mit der Assemblyversion befassten. Ich frage mich also, ob die Leute die Dateiversion (die sich häufig ändert) und die Assembly-Version (die Sie im Windows 10-Datei-Explorer nicht sehen können) verwechseln. Um die Assembly-Version einer DLL anzuzeigen, können Sie diese in Powershell ausführen. Ersetzen Sie den DLL-Namen durch den Namen, für den Sie die Version suchen möchten.

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

Das Ergebnis von oben ist.

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

Siehe Referenzen:

Wie kann ich die Assembly-Version einer .NET-Assembly unter Windows Vista und höher anzeigen (Windows 7, 2008)?

https://support.microsoft.com/en-nz/help/556041

Geben Sie hier die Bildbeschreibung ein


12
Upvote für den Unterschied zwischen der Dateiversion und der Assembly-Version !!
Mrid
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.