2011-11-15 15 views
14

Digamos que tengo un par de aplicaciones en una carpeta (cada aplicación tiene subcarpetas donde se pueden situar los plugins):MEF plugin de búsqueda recursiva

  • clientes
    • Aplicación A
      • ...
    • Aplicación B
      • ...
    • Aplicación C
      • ...
    • ...

Algunos archivos de estas aplicaciones tienen un atributo de exportación-aplicado, otros no. Ahora, quiero poder cargar estos complementos en algunas de estas aplicaciones. ¿Existe una forma adecuada de permitir que MEF busque de manera recursiva en cada subcarpeta de una carpeta específica?

Respuesta

16

No, necesitará recurse a través de los directorios usted mismo creando un DirectoryCatalog para cada uno. Luego, combine todos los DirectoryCatalog s con un AggregateCatalog para crear el contenedor.

2

Otra forma es hacer que todos los archivos dll bajo un diredtory especificado (recursivley) y cargarlos uno por uno utilizando el conjunto cataglog.`

var catalog = new AggregateCatalog(); 

     var files = Directory.GetFiles("Parent Directory", "*.dll", SearchOption.AllDirectories); 

     foreach (var dllFile in files) 
     { 

      try 
      { 
       var assembly = Assembly.LoadFile(dllFile); 
       var assemblyCatalog = new AssemblyCatalog(assembly); 
       catalog.Catalogs.Add(assemblyCatalog); 
      } 
      catch (Exception e) 
      { 
       // this happens if the given dll file is not a .NET framework file or corrupted. 

      } 
     }` 
0

creé una implementación basada en Nicholas Blumhardt respuesta, espero que el código ayuda a los demás en el futuro.

private void RecursivedMefPluginLoader(AggregateCatalog catalog, string path) 
     { 
      Queue<string> directories = new Queue<string>(); 
      directories.Enqueue(path); 
      while (directories.Count > 0) 
      { 
       var directory = directories.Dequeue(); 
       //Load plugins in this folder 
       var directoryCatalog = new DirectoryCatalog(directory); 
       catalog.Catalogs.Add(directoryCatalog); 

       //Add subDirectories to the queue 
       var subDirectories = Directory.GetDirectories(directory); 
       foreach (string subDirectory in subDirectories) 
       { 
        directories.Enqueue(subDirectory); 
       } 
      } 
     }