2009-05-13 6 views
5

Tengo una aplicación MEF (Microsoft Extension Framework) que carga algunos ensambles desde una carpeta. Necesito enumerar los ensamblados que produjeron exportaciones para mi aplicación.¿Cómo enumerar ensamblajes dentro de AggregateCatalog o DirectoryCatalog en MEF?

Una forma de hacerlo es enumerando las importaciones llamando al GetExportedObject().GetType().Assembly. Pero sería más limpio hacer esto sin instanciar las importaciones. ¿Hay alguna manera de obtener ensamblajes cargados desde un catálogo o cualquier otra cosa?

Necesito asambleas para obtener sus atributos como copyright, versión, nombre y tal. Mi carpeta puede contener tanto ensamblados con exportaciones como sin ellos, pero solo necesito ensamblajes que satisfagan cualquier importación en la aplicación.

Respuesta

2

El AssemblyCatalog tiene una propiedad de ensamblaje. AggregateCatalog no tiene una forma de obtener esta información directamente; no hay garantía de que los catálogos internos incluso carguen sus piezas de un ensamblaje. DirectoryCatalog no tiene esta capacidad, aunque podría ser posible agregarla si hubiera una buena razón.

¿Por qué desea obtener la lista de conjuntos? Puede ser mejor que no use un catalag de directorio, en su lugar solo escanee y cargue los ensamblados en un directorio usted mismo, y cree un Catalogo de ensamblaje para cada uno y agréguelo a un AgregadoCatalogo.

EDITAR: MEF no tiene una forma de obtener una lista de todas las exportaciones que fueron "usadas" en la composición. Probablemente podría escribir su propio catálogo que devolvería las definiciones de las piezas que eran conchas alrededor de las definiciones de las piezas predeterminadas y un seguimiento de las partes a las que se les había llamado GetExportedObject. Puede usar las API en ReflectionModelServices para descubrir qué tipo corresponde a una definición de parte determinada de los catálogos predeterminados. Tenga en cuenta que escribir un catálogo así probablemente no sea una tarea simple.

+0

He actualizado la pregunta sobre por qué necesito los ensamblajes. En realidad, incluso si DirectoryCatalog devuelve los ensamblajes no resolvería mi objetivo porque la lista podría contener dll de MEF que no tienen nada que ver con _my_ imports. Si pudiera obtener el ensamblado de Export sin llamar al GetExportedObject, o tener los ensambles de importaciones satisfechas de alguna otra manera ... –

+0

Agregaré que necesito este mismo tipo de funcionalidad.Me estoy integrando con otro sistema que usa BuildManager y quiero agregar ensamblajes que estoy usando con MEF para BuildManager. –

2

Aquí está mi solución actual que funciona muy bien:

  1. No utilice DirectoryCatalog, asambleas de carga directamente y crear un AssemblyCatalog de ellos.
  2. Utilice AssemblyCatalog.Parts para averiguar qué ensamblajes tienen exportaciones, deje que el usuario los autorice.
  3. Agregue solo el Catálogo de ensamblaje autorizado al AgregadoCatalog, que se encuentra en la composición.
0

Si tiene acceso a la fuente de esos conjuntos, entonces tengo una solución alternativa para agregar ensamblajes uno por uno. Puede crear una interfaz llamada IModule y hacer que sea un requisito para todos sus ensamblajes exportar eso. A continuación, puede ImportAll ellos en su bootstraper:

[ImportMany] 
public List<IModule> Modules { get; set; } 

Esta lista contendrá una lista de todas las clases del módulo a través del cual se puede acceder a la asamblea:

var module1 = Logic.Instance.Modules[0]; 
var fullename = module1.GetType().Assembly.FullName; 
5

Esta es una manera de hacerlo, y se utiliza en Caliburn.Micro:

var aggregateCatalog = new AggregateCatalog(...); 
var assemblies = aggregateCatalog.Parts 
    .Select(part => ReflectionModelServices.GetPartType(part).Value.Assembly) 
    .Distinct() 
    .ToList(); 
+0

mejor respuesta! de esta manera puedo seguir utilizando un DirectoryCatalog y aún obtener una lista de todos los ensamblados que fueron cargados (las partes) a través de MEF. En el código anterior cambié AggregateCatalog a DirectoryCatalog. – juFo

+0

¡Gracias! Esto me ahorró mucha lucha. Sabía que debía haber alguna forma de obtener más información de esa pobre lista de "Partes". –

Cuestiones relacionadas