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
Excelente respuesta. Yo votaría varias veces si pudiera. –
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. –
@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. –