假设我有几个应用程序在一个文件夹中(每个应用程序都有子文件夹,其中可以放置插件):
- 客户端
- 应用程序A
- ...
- 应用程序B
- ...
- 应用程序C
- ...
- ...
- 应用程序A
不,你需要自己递归遍历目录,并为每个目录创建一个DirectoryCatalog
。然后,使用AggregateCatalog
将所有的DirectoryCatalog
组合在一起,创建容器。
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.
}
}
有一个MEFContrib项目可用,其中包含一个RecursiveDirectoryCatalog,专门用于此目的...
我基于Nicholas 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);
}
}
}