C # Laden Sie verschiedene Versionen der Baugruppe in dasselbe Projekt

8

Ich erstelle ein Tool, das mehrere Operationen wie NUnit ausführt. In diesem Tool öffne ich .dll assembly und starte Methoden, um einen Test zu starten.

Alles läuft gut, bis ich die .dll mit unserem Programm neu starten muss. Die Idee ist, dass wenn das Tool ausgeführt wird, die benötigte Assembly in einen temporären Ordner kopiert und von dort aufgerufen wird. Wenn ich neu laden muss, kopiere ich einen anderen in einen anderen temporären Ordner und versuche, neu aus einem anderen Ordner zu laden, und lade das vorherige Assembly-Objekt

%Vor%

Aber mein Problem ist, dass, nachdem ich AssemblyFullPath zu einem neuen geändert habe und Assembly.LoadFrom aufgerufen habe, nur die alte Assembly zurückgibt, die zum ersten Mal geladen wurde, aber nicht die zweite! Vielleicht ist das Problem, dass wir mehrere Baugruppen mit verschiedenen Versionen nicht laden können? Was ist die Lösung?

    
Vitalii 19.12.2013, 16:08
quelle

3 Antworten

9

Die CLR unterstützt das Laden mehrerer Versionen von Assemblys mit starkem Namen in dieselbe AppDomain . Dies funktioniert jedoch nur, wenn Ihre Assemblies stark benannt sind und jeder eine andere Version als die andere hat.

Ich vermute, es ist wahrscheinlicher, dass es sich um nicht signierte Assemblys handelt. Wenn das der Fall ist, dann ist das, wonach Sie fragen, nicht wirklich möglich. Sobald eine bestimmte Assembly in ein AppDomain geladen wurde, bleibt sie so lange dort, bis die AppDomain entladen ist. Um dies zu erreichen, müssen Sie die gesamte Arbeit um die geladenen Assemblies in ein separates AppDomain abstrahieren und ein neues AppDomain für jede Assembly verwenden

    
JaredPar 19.12.2013, 16:11
quelle
1

Um JaredPars Antwort zu erweitern, müssen Sie ein neues AppDomain erstellen und Remoting verwenden, um zwischen den beiden zu kommunizieren.

Sehen Sie sich Ссылка an, um Ihnen den Einstieg zu erleichtern.

    
Andrew 19.12.2013 16:18
quelle
0

Versuchen Sie es so:

%Vor%

Da alle Ressourcen aus der Assembly nicht neu geladen / ersetzt werden können, sind Assemblierungsressourcen vorhanden, während die Anwendung noch ausgeführt wird. Es wird nur ersetzt / entfernt, wenn die Anwendung entladen wird oder die Assembly, die sie enthält.

Verwenden Sie die LoadFile () -Methode. Hoffe es hilft.

    
Israel Ocbina 13.05.2014 05:19
quelle