2011-11-15 18 views
14

のは、私はフォルダ内のいくつかのアプリケーション(各アプリケーションがプラグインを配置することができ、サブフォルダを持っている)持っているとしましょう:MEF再帰的なプラグインの検索

  • クライアント
    • アプリケーションA
      • を...
    • アプリケーションB
      • ... 0これらのアプリケーションで
  • アプリケーションC
    • ... ...

いくつかのファイルが適用される輸出の属性を持って、他にはありません。今、これらのプラグインをこれらのアプリケーションの一部にロードできるようにしたいと考えています。指定したフォルダのすべてのサブフォルダでMEFを再帰的に検索させる適切な方法はありますか?

答えて

16

いいえ、ディレクトリごとに再帰して、それぞれについてDirectoryCatalogを作成する必要があります。次に、DirectoryCatalogのすべてをAggregateCatalogと組み合わせてコンテナを作成します。この目的のためだけにRecursiveDirectoryCatalogを持っている利用可能MEFContribプロジェクトがあります

2

もう一つの方法は、指定されたdiredtory(recursivley)の下にあるすべてのdllファイルを取得し、ずつそれらをロードすることです1私はニコラスBlumhardt答えに基づいた実装を作成したアセンブリ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

を使用して、私は、コードが将来的に他の人に役立つことを願っています。

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); 
       } 
      } 
     } 
関連する問題