2016-05-25 33 views
5

Ich habe eine WCF Plugin-Dienst, der Plugins über MEF lädt und läuft sie.Was ist die empfohlene Methode zum Ausführen von Plugins mit Abhängigkeitsdlls, die eine andere Version haben?

Jedes Plugin ist ein Verzeichnis mit mehreren DLLs, das eine spezifische Schnittstelle implementiert.

Ich lade alle Plugins in der gleichen AppDomain mit MEF (DirectoryCatalog) und führen Sie sie in einer generischen Weise (mit Reflektion).

kann nun davon ausgehen, ich habe zwei Plugins mit dll-Abhängigkeiten:

Plugin1 
    ----> Entities 1.0.0.1 

Plugin2 
    ----> Entities 1.0.0.2 

Ich habe einige neue Einheiten in 1.0.0.2 hinzugefügt.

Wenn ich das Plugin ausführen, bekomme ich einen sporadischen Fehler, dass die neuen Entitäten nicht in der DLL vorhanden sind.

Ich vermute, dass der Fehler auftritt, da ich den Code in der gleichen AppDomain ausführen und die erste Entities.dll, die lädt, ist die, die alle meine Plugins dienen wird.

Also, wie kann ich jedes Plugin mit Isolierung, ohne eine neue appdomain erstellen ausführen?

Gibt es eine Möglichkeit, dass ich MEF sagen kann, um alle Plugin-Abhängigkeiten irgendwie zu laden?

Ich habe über ein paar Lösungen im Web lesen:

  1. für jedes Plugin eine neue Appdomain erstellen - Ich will nicht dorthin gehen.

  2. Verwenden Sie die <dependentAssembly> - Das hat nicht funktioniert, wenn ich versuche es zuerst und ich möchte nicht mein Plugin-Server auf jeder Baugruppe Abhängigkeit Versionsänderung aktualisiert. Außerdem möchte ich Plugins mit verschiedenen Assembly-Versionen ausführen können.

  3. Melden Sie die Baugruppen mit einem Snk - ich habe dies noch nicht versucht und ich bin mir nicht sicher, ob diese Lösung funktioniert. Woher weiß der Rahmen, dass er eine andere Baugruppe laden muss? Wie unterscheidet sich das von Versammlungen mit verschiedenen Versionen? Muss ich meinen Dienst irgendwie konfigurieren, damit dies funktioniert?

Hat jemand eine bessere Idee für mich? Was ist die empfohlene Art, isolierte Plugins auszuführen?

Antwort

3

Sie müssen Ihre Baugruppen signieren und sicherstellen, dass die Assembly-Version auf jeder Version unterschiedlich ist. Siehe die Antwort der folgenden Optionen: C# Load different versions of assembly to the same project

Die CLR mehrere Versionen stark benannte Baugruppen in derselben AppDomain Laden unterstützt. Dies funktioniert jedoch nur, wenn Ihre Assemblies stark benannt sind und jeder eine andere Version als die andere hat.