MEF零件清单有时是空的

时间:2012-02-02 20:09:54

标签: mef

我目前正在使用MEF和DirectoryCatalog从某些扩展DLL加载某些部分。它适用于我和大多数使用该程序的人,但有些用户会遇到根本没有加载的部分。收集一些调试信息,似乎MEF确实加载了DLL(catalog.LoadedFiles列出了它们),但是catalog.Parts中没有列出任何部分。

一个用户在XP sp3上,一个在Windows 7上,所以我认为操作系统不是问题所在。有没有人知道为什么会发生这种情况?

以下是实际创建容器的代码,以防它可以帮助解决任何问题。

        private static IEnumerable<Task> CreateTypes()
    {
        CompositionContainer container = GetContainer();
        var exp = container.GetExports<Task>();
        return exp.Select(e => e.Value);
    }

    private static CompositionContainer container;
    public static CompositionContainer GetContainer()
    {
        if (container != null)
            return container;

        DirectoryCatalog catalog = new DirectoryCatalog(ExtensionDirectory, "*.dll");
        container = new CompositionContainer(catalog);
        return container;
    }

2 个答案:

答案 0 :(得分:1)

(是的,我正在回答我自己的问题...一年多以后......)

http://mikehadlow.blogspot.com/2011/07/mef-directorycatalog-fails-to-load.html

基本上,因为有些人使用IE下载程序然后解压缩Windows资源管理器,DLL被标记为来自互联网,因此MEF拒绝加载他们的部分,尽管它们仍然出现在目录中。

解决方案(至少对我的情况而言)只是删除表示DLL来自互联网的备用数据流,如上面的链接所述。

答案 1 :(得分:0)

  

但另一个是“C:\ Spiele”,听起来像是用户创建的文件夹

让我想起这个:

  

装配加载问题

     

在.NET中,可以加载程序集的不同上下文。默认加载上下文通常是最好的加载上下文,但它不能加载不在应用程序基目录中的程序集,包含在探测路径中的应用程序库的子目录或GAC。使用DirectoryCatalog或将路径传递给AssemblyCatalog构造函数时,MEF将尝试在默认的加载上下文中加载程序集。但是,如果程序集不在探测路径或GAC中,则这是不可能的,MEF将在加载 - 来自上下文中加载它们。

     

load-from上下文可能导致类型标识问题,导致InvalidCastException,MissingMethodException或其他错误。为了避免MEF应用程序中的这些问题,您可以将任何扩展目录放在应用程序基目录下,并将它们添加到应用程序配置文件中的探测专用路径中。有关.NET中的程序集加载的其他选项和更多信息,请参阅程序集加载MSDN文档的最佳实践。

有关更多调试信息和工具,请参阅源“How to Debug and Diagnose MEF Failures”。