2010-12-15 8 views
13

Ich arbeite mit einer Drittanbieter-Assembly und leider muss ich jetzt ihre neueste und eine vorherige Version in mein Projekt laden, so dass ich zur Laufzeit entscheiden kann, welche zu laden. Ich brauche immer nur eines, nicht beides.Loading mehrere Versionen der gleichen Baugruppe

In diesem Sinne bin ich auch abhängig von den Typen, die von den Komponenten zur Verfügung gestellt werden, so dass ich nicht aus Reflexion laden und jedes Mal für die Methode/Ereignisse/Schnittstellen, die ich verwenden möchte. Ich habe eine Erwähnung der Handhabung dieses über AppDomain s gesehen, bin aber nicht sicher, wie es weitergehen soll.

Wäre der Prozess gegen eine Version der Komponente zu codieren und dann zur Laufzeit (unter Verwendung der AppDomain) in der richtigen DLL tauschen möchte ich konsumiert werden? Also würde ich das nur beim Start machen?

Antwort

0

Wenn Sie zwei verschiedene Versionen derselben Komponente haben, bedeutet dies, dass sich beide Versionen nicht nur in der Implementierung, sondern auch in der Anzahl der Operationen unterscheiden können. Wenn dies der Fall ist, wie können Sie die Versionen wechseln, wenn einige Funktionen nur in einer von zwei Versionen verfügbar sind?

Wie auch immer, wenn Sie die zwei Versionen laden möchten, müssten Sie dies in zwei separaten Anwendungsdomänen tun, denn dann können Sie die, die Sie danach nicht benötigen, entladen. Dann können Sie Ihre Logik in der richtigen Anwendungsdomäne ausführen, wie in How do I create an application domain and run my application in it? beschrieben.

4

Hier sind ein paar Posts von hier auf SO, die beschreiben, wie mehrere Versionen derselben Assembly laden:

Dieser Beitrag beschreibt, wie zwei verschiedene Versionen von log4net verweisen. Siehe @Joe B's Kommentar unter der angenommenen Antwort für ein bisschen mehr Details darüber, wie er sein Problem gelöst hat.

3rd party libraries refer to different versions of log4net.dll

Diese Antwort auf diesen Link verweist:

Using different versions of the same assembly in the same folder

In diesem Thread gibt es eine Verwarnung über die verschiedenen Versionen der gleichen Baugruppe im gleichen Kontext Laden und Referenzen Link auf MSDN:

http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions

Hier ist eine andere mit einer Antwort, die AssemblyResolve mit schlägt vor: Reference two equal assemblies, only public keys differ

7

Wenn beide Baugruppen kompatibel sind Sie in der app.exe definieren .config- oder web.config-Datei, um immer die neue Version zu verwenden, indem bindingRedirect deklariert wird.

Beispiel

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v1.0.3705"> 
     <dependentAssembly> 
      <assemblyIdentity name="Regcode" publicKeyToken="b03f5f7f11d50a3a" culture=""/> 
      <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.0.3300.0"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

dieser config-Eintrag für Dotnet 1.0 erzählt die asembly loader 1.0.3300.0 Version egal verwenden immer das, was in die Berufung exe kompiliert wird. Dasselbe ist möglich mit neueren Dotnet-Versionen