2011-11-15 12 views
14

चलो कहते हैं कि मैं एक फ़ोल्डर में कुछ अनुप्रयोगों है (प्रत्येक आवेदन सबफ़ोल्डर जहां प्लगइन्स स्थित किया जा सकता है) करते हैं:MEF पुनरावर्ती प्लगइन खोज

  • ग्राहकों
    • आवेदन एक
      • ...
    • आवेदन बी
      • ...
    • आवेदन सी ​​
      • ...
    • ...

इन आवेदनों में कुछ फ़ाइलें एक निर्यात-विशेषता लागू किया है, दूसरों को नहीं। अब, मैं इन अनुप्रयोगों में से कुछ में इन प्लगइन्स को लोड करने में सक्षम होना चाहता हूं। क्या किसी निर्दिष्ट फ़ोल्डर के प्रत्येक सबफ़ोल्डर में MEF खोज को दोबारा खोजने का कोई उचित तरीका है?

उत्तर

16

नहीं, आपको प्रत्येक के लिए DirectoryCatalog बनाने वाली निर्देशिकाओं के माध्यम से पुन: सेवा करने की आवश्यकता होगी। फिर कंटेनर बनाने के लिए AggregateCatalog के साथ DirectoryCatalog एस के सभी गठबंधन करें।

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); 
       } 
      } 
     } 
संबंधित मुद्दे