MEF递归插件搜索

14
假设我有几个应用程序在一个文件夹中(每个应用程序都有子文件夹,其中可以放置插件):
  • 客户端
    • 应用程序A
      • ...
    • 应用程序B
      • ...
    • 应用程序C
      • ...
    • ...
这些应用程序中的某些文件有Export属性,而其他文件则没有。现在,我想能够在其中一些应用程序中加载这些插件。是否有一种合适的方法让MEF在指定文件夹的每个子文件夹中进行递归搜索?
4个回答

17

不,你需要自己递归遍历目录,并为每个目录创建一个DirectoryCatalog。然后,使用AggregateCatalog将所有的DirectoryCatalog组合在一起,创建容器。


2
另一种方法是获取指定目录下(递归)的所有DLL文件,并使用程序集目录逐个加载它们。
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.

            }
        }

1

1

我基于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);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接