使用MEF时,为什么汇编引用会成功加载?

时间:2013-10-25 17:00:28

标签: c# mef assembly-resolution

与MEF用户的常见问题相反,我并没有试图找出为什么我加载MEF 的程序集的依赖关系不能解决。我正在解决相反的问题 - 试图找出依赖 加载的原因。

情况是我有一个ASP.NET应用程序,它使用MEF动态加载驻留在外部应用程序目录的扩展程序集。在我用MEF探测的不同目录中可能有相同扩展程序集的多个版本,每个目录都有自己的依赖项集,这些依赖项可能是单个程序集的多个版本(即扩展名 A.dll,1.0.0.0 具有依赖关系 D.dll,1.0.0.0 ,扩展名 B.dll,2.0.0.0 具有依赖关系 D.dll,2.0。 0.0 )。

它的工作原理是所有扩展及其所有依赖项都已正确加载。而且我不知道为什么。我的web.config文件中没有特殊设置。 official documentation on assembly resolving中的哪个地方说它应该有效?它没有说明查看请求程序集所在的同一目录。

我希望Fusion Log Viewer会告诉我运行时如何定位依赖项,但即使它向我显示给定依赖项的所有不同版本的绑定请求,当我单击它以查看完整日志时,我只看到失败的绑定(是的,I have it set to log all binding requests,而不只是失败的绑定。)

有人能指出我正式文件的一部分,解释为什么这种情况有效吗?

1 个答案:

答案 0 :(得分:1)

MEF的主要分辨率由使用的ComposablePartCatalog决定。例如,如果使用DirectoryCatalog,则会探测并找到指定目录中的所有程序集。

通过查看CompositionContainer,您应该能够找到适当的目录,而这些目录又应该提供有关部件正常构成原因的一些细节。

由于"Other Locations Probed"中定义的规则,您的依赖关系也可能被找到:

  

如果程序集使用LoadFrom方法引用另一个程序集,则调用程序集的位置将被视为关于在何处查找引用的程序集的提示。如果找到匹配项,则加载该程序集。


如果您使用DirectoryCatalog在目录中查找程序集,它会在内部加载该文件夹中的每个程序集。这将导致在构造DirectoryCatalog时将所有依赖项加载到进程中。