MEF递归插件搜索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MEF递归插件搜索相关的知识,希望对你有一定的参考价值。

假设我在一个文件夹中有一些应用程序(每个应用程序都有可以找到插件的子文件夹):

  • 客户端 申请A. ... 申请B. ... 申请C. ... ...

这些应用程序中的某些文件应用了Export属性,而其他文件则没有。现在,我希望能够在其中一些应用程序中加载这些插件。是否有一种正确的方法让MEF在指定文件夹的每个子文件夹中递归搜索?

答案

不,你需要自己递归目录,为每个目录创建一个DirectoryCatalog。然后,将所有DirectoryCatalogs与AggregateCatalog组合以创建容器。

另一答案

另一种方法是将所有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.

            }
        }
另一答案

有一个MEFContrib项目可用于此目的的RecursiveDirectoryCatalog ...

https://www.nuget.org/packages/MefContrib/

另一答案

我创建了一个基于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);
        }
    }
}

以上是关于MEF递归插件搜索的主要内容,如果未能解决你的问题,请参考以下文章

.Net插件编程模型:MEF和MAF

MEF插件架构上的“即发即弃”方法

MEF - 插件及其引用的程序集

从 MEF 插件中读取 AppSettings

C#]插件编程框架 MAF 开发总结

#VSCode保存插件配置并使用 gist 管理代码片段