2013-04-09 11 views
12

Angenommen, ich habe Baugruppen in GAC mit den Versionen 1.1.1.5, 1.1.5.1, 1.1.6.2, 1.2.1.1 und 2.1.2.1. Meine Anwendung hat eine Referenz der Version 1.1.3.0. Welche Assembly wird zur Laufzeit abgeglichen? und was sind die tatsächlichen Regeln für den Assembly-Abgleich?Wie funktioniert die Assembly-Version genau?

Antwort

7

Wenn Ihre Referenz eine bestimmte Version erfordert, wird sie beim Laden der Baugruppe standardmäßig fehlschlagen, da diese Version nicht existiert.

Dies kann jedoch über Assembly Binding Redirection konfiguriert werden. Es gibt verschiedene Optionen, was hier passiert, einschließlich:

  • Die Referenz kann sagen, dass es nicht die Versionsverwaltung interessiert, in diesem Fall wird das neueste geladen.
  • Sie können configure your application in einer Weise, dass Sie angeben, wie die Bindung umleiten.
  • Die Baugruppe in der GAC kann setup with a publisher policy sein, die angibt, wie damit umzugehen ist.
  • +0

    Sind Sie sicher? Weil diese Dokumentation sagt: "Assemblies mit demselben Namen, Major und Minor Versionsnummern, aber verschiedene Revisionen sollen vollständig austauschbar sein" http://msdn.microsoft.com/en-us/library/system.version.aspx – user960567

    +0

    @ user960567 Ich hatte Bindungs-/Ladefehler, selbst wenn nur die Build-Nummer nicht übereinstimmte. Das ist die Absicht, aber die Richtliniendateien müssen noch existieren. –

    +0

    Bedeutet dies, dass die Dokumentation nicht korrekt ist? – user960567

    5

    Welche Baugruppe wird zur Laufzeit abgeglichen?

    Keine wird gefunden, Ihr Programm wird bombardieren.

    Die Dokumentation für die Versionsklasse spricht generisch über, wie Sie Versionsnummern auswählen. Und ja, normalerweise betrachten Sie eine Änderung der Build-Nummer als eine nichtbrechende Änderung. Und eine Änderung der Revision als geringes Risiko. Dinge, die Sie berücksichtigen, wenn Sie eine [AssemblyFileVersion] auswählen.

    jedoch die Standard-CLR Politik tut nicht diese Art der Interpretation der [Assembly] umzusetzen, besteht darauf, es auf ein genauen Spiel. Es ist nur glücklich, wenn es genau die DLL findet, mit der Sie Ihr Programm kompiliert haben. Dies ist normalerweise nicht schwierig zu gewährleisten. Sie können diese Richtlinie überschreiben und sie schwächer machen, obwohl Sie immer darüber nachdenken sollten. Es gibt eine sehr lange Geschichte von gut beabsichtigten kleinen Änderungen im Quellcode, die einfach nicht so gut in der Praxis aus. Etwas, das Microsoft zu gut kennt, muss Code beibehalten, der für Jahrzehnte dauert. Die Standard Gegenmaßnahmen gegen DLL Hell in der CLR sind hart wie ein Stein. Wie sie sein sollten. Lass es dir sagen.

    +0

    Bedeutet Dokumentation bei http://msdn.microsoft.com/en-us/library/system.version.aspx ist falsch. Ich habe dies in Framework 1.1 getestet, es wählt die Version mit nur passend major.minor. Wird es in 4.0 geändert? – user960567

    +1

    @user Die Dokumentation, die Sie verlinkt haben, widerspricht dieser Antwort nicht. Der Teil, den Sie gerade lesen, befindet sich wahrscheinlich im Abschnitt "Bemerkungen", der über * Konventionen * spricht. Genau das sagt Hans hier im mittleren Absatz.Und wie ein allgemeiner Ratschlag, wenn Sie sich für das Verhalten in alten Frameworks wie 1.1 interessieren, sollte das explizit in Ihrer Frage erwähnt werden. Die Antworten werden tendenziell die aktuelle oder aktuelle-1-Version annehmen. –

    Verwandte Themen