2011-11-15 116 views
14

比方说,我有几个应用程序文件夹中(每个应用程序都有子文件夹,其中的插件可以设置):MEF递归插件搜索

  • 客户
    • 应用程序A
      • ...
    • 应用B
      • ...
    • 应用程序C
      • ...
    • ...

在这些应用中的一些文件有一个应用导出属性,有的则没有。现在,我希望能够在这些应用程序中加载这些插件。有没有适当的方法让MEF在指定文件夹的每个子文件夹中递归搜索?

回答

16

不,您需要通过自己的目录递归为每个目录创建一个DirectoryCatalog。然后,将所有DirectoryCatalogAggregateCatalog合并以创建容器。

2

另一种方法是获得指定diredtory(recursivley)下的所有dll文件,并通过加载它们一个一个使用汇编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

我创建了一个基于在尼古拉斯Blumhardt答案的实现,我希望代码可以帮助别人的未来。

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); 
       } 
      } 
     }