2011-03-22 20 views
16

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 el .dll que las contiene) cuando un usuario decide deshacerse de ese complemento.¿Cómo eliminar los complementos MEF en tiempo de ejecución?

CompositionBatch haría lo que necesito, pero es necesario ComposablePart casos como parámetros de entrada para RemovePart() método, y sólo tengo objetos de civil que implementan la interfaz ISomething o ComposablePartDefinition casos en el AggregateCatalog. Así que el que mi pregunta es:

  • ¿Cómo puedo encontrar la ComposablePart instancia que representa el objeto importado que quiero para deshacerse de?
  • O alternativamente: ¿cómo obtengo la lista de los objetos ComposablePart que pertenecen a a un cierto .dll?

me gustaría utilizar algo como sigue:

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

Respuesta

28

cómo consigo la lista de objetos ComposablePart que pertenecen a un determinado .dll?

Para retirar las piezas de un ensamblaje en particular, sólo podía quitar ese AssemblyCatalog llamando AggregateCatalog.Catalogs.Remove. Sin embargo, tendrá que diseñar sus piezas para permitir Recomposition.

Sin embargo, esto no le ayudará a eliminar el conjunto de complementos. El ensamblaje seguirá cargándose y no podrá cambiar o eliminar un ensamblado .NET mientras está cargado. La única manera de descargar un ensamblaje sin detener el proceso es descargando el AppDomain en el que se cargó. Pero si introduce un AppDomain por separado para los complementos, básicamente tendrá que comunicarse con esos complementos a través de la comunicación remota, etcétera.

Probablemente sea mucho más simple, más seguro y eficaz detener la aplicación, eliminar el conjunto de complementos y reiniciar.

edición: en realidad, no es una manera de borrar el archivo plugin DLL sin detener el proceso o descarga de todo el dominio de aplicación: puede habilitar shadow copying para el dominio de aplicación para instruir a .NET para hacer una copia antes cargando el conjunto. La copia permanecerá cargada, pero al menos puede eliminar o reemplazar el archivo original.

+0

Excelente respuesta. Yo votaría varias veces si pudiera. –

+0

Parece que sería bueno que MEF apoye la descarga de ensamblajes en el futuro. Quiero poder actualizar los complementos en su lugar. Reiniciar la aplicación no es un compromiso aceptable, y no puedo sobrescribir la DLL sin descargar el ensamblado. Entonces probablemente no pueda usar MEF como está. Tendré que escribir algo con reflexión. –

+1

@Josh G: No veo cómo escribir su propio sistema de complemento utilizando la reflexión va a resolver cualquier cosa. Los problemas descritos con la descarga no están limitados a MEF, así es como funciona .NET. –

1

¿Podría MAF ayudarte aquí? No soy un experto pero entiendo que con MAF los complementos permanecen en su propio proceso y pueden descargarse en tiempo de ejecución. Supongo que esto no daría el rendimiento ideal ya que está comunicando el proceso cruzado, pero si eso no es un problema importante, podría valer la pena echarle un vistazo.

Cuestiones relacionadas