为什么在使用 MEF 时程序集引用会成功加载

本文关键字:引用 成功 加载 程序集 MEF 为什么 | 更新日期: 2023-09-27 18:36:51

与 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文件中没有特殊设置。在关于程序集解析的官方文档中,它在哪里说它应该工作?它没有说明如何查看请求程序集所在的同一目录。

我希望 Fusion Log 查看器能告诉我运行时如何定位依赖项,但即使它向我显示了给定依赖项的所有不同版本的绑定请求,当我单击它以查看完整日志时,我只看到失败的绑定(是的,我已将其设置为记录所有绑定请求, 不仅仅是失败的)。

谁能指出官方文档中解释为什么这种情况有效的部分?

为什么在使用 MEF 时程序集引用会成功加载

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

通过查看 CompositionContainer ,您应该能够找到现有的目录,这些目录又应该提供有关零件正确组成的原因的一些详细信息。

由于

"探测的其他位置"中定义的规则,也有可能找到您的依赖项:

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


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