比方说,我有几个应用程序文件夹中(每个应用程序都有子文件夹,其中的插件可以设置):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);
}
}
}