54

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

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

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

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

4

3 回答 3

56

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

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

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

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

于 2008-09-08T16:10:16.637 回答
7

我发现一篇文章引用了关于DLL 搜索顺序的 MSDN 文章,上面写着

对于托管代码依赖项,始终以全局程序集缓存为准;如果 GAC 中存在现有(或具有策略的更新)副本,则不会拾取应用程序目录中的本地程序集。

考虑到这一点,我猜 MSDN 列表是正确的,加上一个

0. 全局程序集缓存
于 2008-09-08T16:08:33.613 回答
2

“加载 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

于 2008-09-08T15:50:45.047 回答