我目前正在使用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;
}
答案 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”。