比方說,我有幾個應用程序文件夾中(每個應用程序都有子文件夾,其中的插件可以設置):MEF遞歸插件搜索
- 客戶
- 應用程序A
- ...
- 應用B
- ...
- 應用程序C
- ...
- ...
- 應用程序A
在這些應用中的一些文件有一個應用導出屬性,有的則沒有。現在,我希望能夠在這些應用程序中加載這些插件。有沒有適當的方法讓MEF在指定文件夾的每個子文件夾中遞歸搜索?
比方說,我有幾個應用程序文件夾中(每個應用程序都有子文件夾,其中的插件可以設置):MEF遞歸插件搜索
在這些應用中的一些文件有一個應用導出屬性,有的則沒有。現在,我希望能夠在這些應用程序中加載這些插件。有沒有適當的方法讓MEF在指定文件夾的每個子文件夾中遞歸搜索?
不,您需要通過自己的目錄遞歸爲每個目錄創建一個DirectoryCatalog
。然後,將所有DirectoryCatalog
與AggregateCatalog
合併以創建容器。
有可用MEFContrib項目具有RecursiveDirectoryCatalog只是這個目的...
另一種方法是獲得指定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.
}
}`
我創建了一個基於在尼古拉斯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);
}
}
}