MEF: "No se puede cargar uno o más de los tipos solicitados. Recupere las excepciones Loader para obtener más información ”

Escenario: estoy usando el Marco de Extensibilidad Administrada para cargar complementos (exportaciones) en tiempo de ejecución basado en un contrato de interfaz definido en un dll separado. En mi solución de Visual Studio, tengo 3 proyectos diferentes: la aplicación host, una biblioteca de clases (que define la interfaz - "IPlugin") y otra biblioteca de clases que implementa la interfaz (la exportación - "MyPlugin.dll").

El host busca exportaciones en su propio directorio raíz, por lo que durante las pruebas, construyo la solución completa y copio Plugin.dll de la carpeta bin / release de la biblioteca de clases de complementos en el directorio de depuración del host para que DirectoryCatalog del host lo encuentre y pueda para agregarlo al CompositionContainer. Plugin.dll no se copia automáticamente después de cada reconstrucción, por lo que lo hago manualmente cada vez que realizo cambios en el contrato / implementación.

Sin embargo, un par de veces he ejecutado la aplicación host sin haber copiado (actualizado) Plugin.dll primero, y ha arrojado una excepción durante la composición:

Unable to load one or more of the requested types. Retrieve the LoaderExceptions for more information

Por supuesto, esto se debe al hecho de que Plugin.dll está intentando importar desde implementa unversión diferente de IPlugin, donde las firmas de propiedad / método no coinciden. Aunque es fácil evitar esto en un entorno controlado y monitoreado, simplemente evitando (duh) implementaciones obsoletas de IPlugin en la carpeta de complementos, no puedo confiar en tales suposiciones en el entorno de producción, donde se pueden encontrar complementos heredados.

El problema es que esta excepción efectivamente falla en toda la acción Componer yNo Las exportaciones son importadas. Hubiera preferido que las implementaciones de IPlugin que no coinciden simplemente se ignoren, de modo que otras exportaciones en los catálogos, que implementan la versión correcta de IPlugin, aún se importen.

¿Hay alguna manera de lograr esto? Estoy pensando en varias opciones potenciales:

Hay una bandera para establecer en CompositionContainer ("ignorar las importaciones fallidas") antes o al llamar a ComposeHay una bandera similar para especificar en el<ImportMany()> atributoHay una manera de "enganchar" al proceso de iteración subyacente a Compose (), y poder manejar cada importación (fallida) individualmenteEl uso de firmas de nombre seguro para buscar de alguna manera las importaciones que implementanactual versión de IPlugin

Ideas?

Respuestas a la pregunta(3)

Su respuesta a la pregunta