2012-02-26 21 views
6

DirectoryCatalog escanea los ensamblajes en un directorio para determinar qué clases se importan/exportan. No se cargan ensamblajes sin una importación/exportación.¿Cómo funciona el Catálogo de MEF de MEF?

Esta es una característica increíble, pero ¿cómo funciona? Para investigar los atributos personalizados en los tipos de un ensamblaje, ¿no necesita cargar el ensamblaje? Una vez que está cargado, no se puede descargar, así que no puede ser así como funciona.

¿Está haciendo algún tipo de magia AppDomain?

Respuesta

10

Pruébelo. DirectoryCatalog simplemente crea un AssemblyCatalog para cada archivo .dll en el directorio dado. Como AssemblyCatalog llama al AssemblyName.GetAssemblyName, los archivos .dll que no sean .NET no se cargarán (se lanza una excepción y se captura dentro del AssemblyCatalog). AssemblyCatalog llama a Assembly.Load en el AssemblyName que creó. Por lo tanto, los ensamblajes se cargan inmediatamente al crear un DirectoryCatalog. Sin magia, no AppDomains. Pero entonces es bien conocido MEF para cargar ensamblajes en el actual AppDomain. Use MAF si desea ensamblajes que puedan descargarse.

+0

Desafortunadamente, MAF es bastante obsoleto y viene con una gran cantidad de limitaciones debido a su uso de la comunicación remota. Aún no he identificado una buena alternativa. Sin embargo, no me di cuenta de que MEF carga los ensamblajes. –

+0

¿Qué quiere decir "ensambles que se pueden descargar"? – Assimilater

1

este es el código de muestra que puede ayudarlo.

var directoryPath = "Dll folder path"; 

//Load parts from the available dlls in the specified path using the directory catalog 
var directoryCatalog = new DirectoryCatalog(directoryPath, "*.dll"); 

//Creating an instance of aggregate catalog. It aggregates other catalogs 
var aggregateCatalog = new AggregateCatalog(); 
aggregateCatalog.Catalogs.Add(directoryCatalog); 

//Crete the composition container 
var container = new CompositionContainer(aggregateCatalog); 

container.ComposeParts(this); 


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

¿Cómo ayuda esto a responder mi pregunta? –

+0

esta es la implementación del catálogo de directorio. cómo puede usar este código para obtener módulos, –

+4

¿Cómo se relaciona eso con mi pregunta? –