2011-01-04 8 views
4

Ich verwende MEF und die System.ComponentModel.Composition.dll, um einige DLL zu laden.Ändern Dll geladen mit MEF

Ich mache so etwas wie:

AggregateCatalog catalog = new AggregateCatalog(new AssemblyCatalog(Assembly.GetExecutingAssembly()), new DirectoryCatalog(directory)); 
_container = new CompositionContainer(catalog); 
_container.ComposeParts(this); 

meine dll zu importieren.

Nach einigen Zeiten möchte ich meine DLL aktualisieren, aber wenn ich versuche, es zu löschen, habe ich einen Zugriff verweigert, weil es alrealdy vom Programm verwendet wird.

Wie kann ich die DLL freigeben, durch eine neue DLL ersetzen und die DLL erneut laden? (Ohne das Programm zu schließen)

Vielen Dank im Voraus für Ihre Hilfe

Antwort

4

Sie benötigen Schatten Kopieren in der AppDomain zu ermöglichen, zwingt dies die Anwendung ähnlich wie einen Web-App zu verhalten, wo die ausführbaren Inhalte nicht von dem Laufe Quellspeicherort, aber ein temporärer Speicherort.

Das einzige Problem, das Sie haben, ist entweder

  1. eine obselete Methode AppDomain.CurrentDomain.SetShadowCopyFiles() verwenden, die es auf der der aktuellen Domäne zwingt. Nicht empfohlen, da dies zu Gunsten von:
  2. abgelehnt wurde Verwenden Sie AppDomainSetup.ShadowCopyFiles = "true"; beim Erstellen einer neuen AppDomain. Sie müssen dann die Ausführung Ihrer Assembly in der anderen AppDomain verschieben. Vielleicht kann das form post helfen?

Ich bin nicht sicher, Sie Schatten Kopieren durch Anwendungskonfiguration ermöglichen können ...

+0

Ich habe viele Wege versucht, aber nicht in der Lage, es zum Laufen zu bringen. Ich musste meinen Antrag auf Restart stellen, um die Möglichkeit zu haben, dll zu aktualisieren :( – Tim

1

Wenn Sie versuchen, auf Katalog ein Objekt Assembly wie folgt einzufügen:

Assembly assembly = Assembly.Load(System.IO.File.ReadAllBytes(Path.Combine(directoryPath, ItemPlugin))); 
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(assembly)); 

Sie löschen können \ Ändern Sie die Datei später ...