2011-11-15 114 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); 
       } 
      } 
     }