为什么在 MEF 中获取导出这么慢?

Why is getting Exports in MEF so slow?

我创建一个MEF容器如下:

        //Compose Plugins
        var aggregateCatalog = new AggregateCatalog();

        IEnumerable<string> directories = FileIO.GetAllSubDirectories(PluginRootDirectory);
        foreach (string directory in directories)
        {
            var catalog = new DirectoryCatalog(directory);
            aggregateCatalog.Catalogs.Add(catalog);
        }

        Container = new CompositionContainer(aggregateCatalog);
        Container.ComposeParts(Container);

然后我尝试按如下方式导出:

    public Dictionary<string, T> GetPlugins<T>()
    {
        var exports = Container.GetExports<T, IPluginAttribute>();
        return exports.ToDictionary(i => i.Metadata.PluginName, i => i.Value);
    }

问题:如何确保在请求 exports/plugins 之前容器已组合?我什至希望第一个请求 GetPlugins<T>() 到 运行 快。我可以忍受更长的初始化时间,但现在看来容器的组成被延迟,直到实际请求导出的插件。

如果有很多文件要通过目录解析,MEF 会花费一些时间catalog.It 将尝试解析目录中的所有二进制文件,无论是托管的还是非托管的。

它还会缓存未标记为导出的 class,因为 MEF 允许您按名称导入 classes,即使它们没有导出属性。

尝试只有一个虚拟 dll 和空白 classes 以查看问题是否与文件或 MEF 过多有关。