2011-11-15 11 views
14

Powiedzmy, że mam kilka aplikacji w folderze (każda aplikacja ma podfoldery, gdzie mogą znajdować się pluginy):MEF wyszukiwania plugin rekurencyjne

  • Klienci
    • aplikacyjne A
      • ...
    • Zastosowanie B
      • ...
    • Zastosowanie C
      • ...
    • ...

Niektóre pliki w tych zastosowaniach mają Export-atrybut zastosowany, inni nie. Teraz chcę móc załadować te wtyczki w niektórych z tych aplikacji. Czy istnieje właściwy sposób, aby umożliwić rekursywne wyszukiwanie MEF w każdym podfolderze określonego folderu?

Odpowiedz

16

Nie, będziesz musiał powtarzać katalogi samodzielnie, tworząc dla każdego z nich DirectoryCatalog. Następnie połącz wszystkie DirectoryCatalog s z AggregateCatalog, aby utworzyć kontener.

2

Innym sposobem jest, aby wszystkie pliki dll pod określonym diredtory (recursivley) i załadować je jeden po jeden przy użyciu zestawu 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

stworzyłem implementację opartą na Nicholas Blumhardt odpowiedź, mam nadzieję, że kod pomaga innym w przyszłości.

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