2012-02-29 23 views
6

Tengo algunos complementos como archivos dll. Mi aplicación carga el dll y funciona bien. pero cuando trato de eliminar el complemento anterior y reemplazarlo con un nuevo complemento, no me permite hacerlo. como ha sido cargado por la aplicación. He descubierto que al usar appdomain podemos hacer eso. pero no puedo encontrar una solución en la que se use mef.Descarga de un archivo dll en mef

Necesito un código que se puede ejecutar en mef. A continuación está mi código que se usa para cargar complementos.

//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); 

Respuesta

4

he descubierto que mediante el uso de dominio de aplicación que podemos hacer eso. pero no puedo encontrar una solución en la que se use mef.

Desafortunadamente, esto no es compatible con MEF. MEF se diseñó específicamente para la extensibilidad de la aplicación, no como un sistema de complemento de propósito general que admita la descarga y la sustitución de código en tiempo de ejecución.

La única manera de hacer que esto funcione sería utilizar MEF dentro de un dominio de aplicación diferente y descargar el dominio de la aplicación como un todo. El CLR en sí mismo no tiene soporte para descargar un ensamblaje cargado que no sea la descarga de todo el dominio de la aplicación en el que se abre el ensamblaje.

+0

debe haber una solución a esto. Escuché que esto va a ser en el próximo lanzamiento de mef. no sé si es verdad o no –

+1

@fhnaseer Nope - al menos no en nada mostrado públicamente hasta el momento. Esto está realmente fuera del caso de uso previsto para MEF, por lo que dudo que ocurra allí. La única forma admitida de eliminar un ensamblado en el CLR es descargar todo el AppDomain. MEF, al ser una biblioteca, no puede "solucionarlo". –

+0

bien, entonces, ¿cuál es el significado de "AllowRecomposition = true" en ImportMany. Si lo escribo o no, el comportamiento es el mismo. –

1

Si se intenta insertar en el catálogo de objetos de una Asamblea como esto:

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

Puede Eliminar/Cambiar el archivo más tarde ...

+1

Puede eliminarlo de aggregateCatalog, pero no podrá descargar el ensamblado desde el dominio de aplicación sin descargar el dominio de aplicación hole. – Peter