c# - ¿Cómo eliminar los complementos de MEF en tiempo de ejecución?
.net (2)
Tengo una aplicación basada en MEF que se puede personalizar con complementos. Esta aplicación tiene varias partes importadas, y quiero eliminar algunas de ellas en tiempo de ejecución (para poder eliminar la .dll que las contiene) cuando un usuario decide deshacerse de ese complemento.
CompositionBatch haría lo que necesito, pero necesita instancias de RemovePart()
como parámetros de entrada para el método RemovePart()
, y solo tengo objetos simples que implementan la interfaz ISomething, o instancias de ComposablePartDefinition
en AggregateCatalog
. Así que mi pregunta es:
- ¿Cómo puedo encontrar la instancia de ComposablePart que representa el objeto importado del que quiero deshacerme?
- O alternativamente: ¿cómo obtengo la lista de objetos ComposablePart que pertenecen a un determinado .dll?
Yo usaría algo como lo siguiente:
var parts = Container.Catalog.Parts
.Where(p => iDontNeed(p))
.Select(p => howDoIConvertComposablePartDefinition2ComposablePart(p));
var batch = new CompositionBatch();
parts.ToList().ForEach(part => batch.RemovePart(part));
Gracias
¿Cómo obtengo la lista de objetos ComposablePart que pertenecen a un determinado .dll?
Para eliminar las piezas de un ensamblaje en particular, simplemente puede eliminar ese AssemblyCatalog
llamando a AggregateCatalog.Catalogs.Remove
. Sin embargo, tendrás que diseñar tus partes para permitir la Recomposition .
Sin embargo, esto no le ayudará a eliminar el ensamblaje del complemento. El ensamblaje aún se cargará y no puede cambiar o eliminar un ensamblaje .NET mientras está cargado. La única forma de descargar un ensamblaje sin detener el proceso es descargando el AppDomain
en el que se cargó. Pero si introduce un AppDomain
separado para los complementos, entonces básicamente tendrá que comunicarse con esos complementos a través de la comunicación remota, etc.
Probablemente sea mucho más simple, seguro y eficaz simplemente detener la aplicación, eliminar el ensamblaje del complemento y reiniciar.
edición : en realidad, hay una manera de eliminar el archivo dll del complemento sin detener el proceso o descargar todo el dominio de aplicaciones: puede habilitar la copia sombra para que el dominio de aplicaciones le indique a .NET que haga una copia antes de cargar el ensamblaje. La copia permanecerá cargada, pero al menos puede eliminar o reemplazar el archivo original.
¿Podría MAF ayudarte en esto? No soy un experto, pero entiendo que con MAF los complementos permanecen en su propio proceso y se pueden descargar en tiempo de ejecución. Supongo que esto no daría el rendimiento ideal, ya que se está comunicando en un proceso cruzado, pero si no es un problema importante, vale la pena echarle un vistazo.