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?
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
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.
Tags und Links .net c# reflection version .net-assembly