以什么顺序搜索位置以加载引用的DLL?

时间:2020-03-05 18:49:25  来源:igfitidea点击:

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

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

这些位置是按什么顺序搜索的?如果找到匹配项,是否停止了对DLL的搜索,或者它在所有位置都继续进行(如果这样,则如何解决冲突)?

另外,请确认或者拒绝这些位置,并提供我没有提及的其他任何位置。

解决方案

回答

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

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

MSDN上也描述了默认的搜索顺序,可以通过应用程序来更改它:http://msdn.microsoft.com/zh-cn/library/ms682586.aspx

回答

我发现有一篇文章引用了DLL搜索顺序上的MSDN文章,内容为

For managed code dependencies, the
  Global Assembly Cache always prevails;
  the local assembly in application
  directory will not be picked up if
  there is an existing (or newer with
  policy) copy in the GAC.

考虑到这一点,我猜MSDN列表是正确的,另外添加了一个

0. Global assembly cache

回答

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

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

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

编辑
http://msdn.microsoft.com/zh-cn/library/aa720133.aspx更详细地说明了该过程。