2012-02-29 11 views
6

Ho alcuni plugin come file dll. La mia applicazione carica la DLL e funziona correttamente. ma quando provo a eliminare il vecchio plugin e lo sostituisco con un nuovo plugin non mi permette di farlo. come è stato caricato dall'applicazione. Ho scoperto che usando appdomain possiamo farlo. ma non sono in grado di trovare una soluzione in cui viene utilizzato mef.Scaricamento di un file dll in mef

Ho bisogno di un codice che può essere eseguito su mef. Di seguito è riportato il mio codice che viene utilizzato per caricare i plugin.

//Creating an instance of aggregate catalog. It aggregates other catalogs 
var aggregateCatalog = new AggregateCatalog(); 

//Build the directory path where the parts will be available 
var directoryPath = "Path to plugins folder"; 

//Load parts from the available dlls in the specified path using the directory catalog 
var directoryCatalog = new DirectoryCatalog(directoryPath, "*.dll"); 

//Add to the aggregate catalog 
aggregateCatalog.Catalogs.Add(directoryCatalog); 

//Crete the composition container 
var container = new CompositionContainer(aggregateCatalog); 


// Composable parts are created here i.e. the Import and Export components assembles here 
container.ComposeParts(this); 

risposta

4

ho scoperto che utilizzando AppDomain possiamo farlo. ma non sono in grado di trovare una soluzione in cui viene utilizzato mef.

Sfortunatamente, questo non è supportato da MEF. MEF è stato progettato specificamente per l'estensibilità dell'applicazione, non come un sistema di plugin generico che supporta lo scarico e la sostituzione del codice in fase di runtime.

L'unico modo per rendere questo lavoro sarebbe utilizzare MEF all'interno di un AppDomain separato e scaricare l'AppDomain nel suo complesso. Lo stesso CLR non ha supporto per lo scaricamento di un assembly caricato diverso dallo scaricamento dell'intero AppDomain in cui viene aperto l'assembly.

+0

ci dovrebbe essere una soluzione a questo. ho sentito che questa sarà la prossima uscita di mef. non lo so è vero o no. –

+1

@fhnaseer No, almeno non in qualsiasi cosa mostrata pubblicamente finora. Questo è davvero al di fuori del caso di utilizzo previsto per MEF, quindi dubito che accadrà lì. L'unico modo supportato per rimuovere un assembly nel CLR è quello di scaricare l'intero AppDomain. Il MEF, essendo una biblioteca, non può "aggirare" quello. –

+0

bene allora qual è il significato di "AllowRecomposition = true" in ImportMany. Se lo scrivo o no il comportamento è lo stesso. –

1

Se si tenta di inserire a catalogo un'Assemblea oggetto come questo:

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

È possibile eliminare/Modificare il file in seguito ...

+1

Puoi eliminarlo da aggregateCatalog ma non sarai in grado di scaricare l'assembly dall'appdomain senza scaricare l'appdomain del foro. – Peter

Problemi correlati