2016-05-07 3 views
0

Ich schrieb eine einfache Plugin - Manager - Klasse mit MEF und FileSystemWatcher für die Aktualisierung von Plugins automatisch, aber ich höre sagen, dass in der Lage, Assemblys (Plugins) hinzuzufügen und zu entfernen Fliege wir brauchen auch eine AppDomain.Warum ist eine AppDomain relevant für einen Plugin - Manager implementiert mit MEF

Kann mir jemand sagen, wann wir AppDomain und MEF zusammen verwenden müssen (besonders für mein Plugin-Manager-Szenario)?

Was ist die Beziehung zwischen ihnen?

Antwort

0

Kurz gesagt, eine AppDomain ist erforderlich, wenn Sie .dlls überschreiben möchten, die von einer Anwendung verwendet werden, und dass AppDomain die ShadowCopyFiles = "true" angeben muss.

Schattenkopieren von Dateien bedeutet, dass die Anwendungsdomäne die DLLs in ein temporäres Verzeichnis kopiert und sie aus diesem temporären Verzeichnis lädt, damit die ursprünglichen .dlls überschrieben werden können.

Leider können die Assemblys, die in eine beliebige AppDomain geladen werden, nicht entladen werden, es sei denn, die AppDomain, die sie enthält, wird entladen. Das Aktualisieren eines Plugins ist deshalb schwierig, weil Sie A) die gesamte AppDomain entladen müssen, die notwendigerweise alle anderen .dlls in dieser AppDomain entfernt, oder B) eine neue Version derselben .dll zulassen geladen, um den Speicherbedarf Ihrer Anwendung zu erhöhen. Die zweite Option erfordert außerdem, dass Ihre Plug-in-.dlls stark benannt sind und eine andere Versionsnummer haben, damit MEF einen Unterschied erkennen und die neue .dll laden kann.