我知道 .NET 框架会在多个位置查找引用的 DLL

  • 全局程序集缓存 (GAC)
  • 添加到 AppDomain 的任何私有路径
  • 执行程序集的当前目录

这些位置的搜索顺序是什么?如果找到匹配项,是否会停止对 DLL 的搜索,还是继续搜索所有位置(如果是,如何解决冲突)?

另外,请确认或否认这些地点,并提供我未提及的任何其他地点。

有帮助吗?

解决方案

程序集加载是一个相当复杂的过程,它取决于许多不同的因素,如配置文件、发布者策略、应用程序域设置、CLR 主机、部分或完整程序集名称等。

简单的版本是首先是 GAC,然后是专用路径。%PATH% 从未被使用过。

最好使用 程序集绑定日志查看器 (Fuslogvw.exe) 调试任何程序集加载问题。

编辑 http://msdn.microsoft.com/en-us/library/aa720133.aspx 更详细地解释了该过程。

其他提示

我发现 一篇文章 参考 MSDN 文章 DLL 搜索顺序 说的是

对于托管代码依赖性,全局汇编缓存始终占上风;如果GAC中有现有(或具有策略的新副本),则应用程序目录中的本地组件将不会被拾取。

考虑到这一点,我猜 MSDN 列表是正确的,但添加了一项

0. Global assembly cache

“加载 DLL 时不再首先搜索当前目录!Windows XP SP1 中也进行了此更改。现在的默认行为是首先查找所有系统位置,然后查找当前目录,最后查找任何用户定义的路径。”

(参考。 http://weblogs.asp.net/pwilson/archive/2003/06/24/9214.aspx)

MSDN 上也描述了可以由应用程序更改的默认搜索顺序: http://msdn.microsoft.com/en-us/library/ms682586.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top