search位置以何种顺序加载引用的DLL?

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

  • 全局程序集caching(GAC)
  • 任何私人path添加到AppDomain
  • 执行程序集的当前目录

这些地点search的顺序是什么? 如果find一个匹配项,就停止search一个DLL,或者通过所有位置继续search(如果是的话,如何解决冲突)?

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

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

简单的版本是GAC第一,然后是私人path。 从来没有使用%PATH%。

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

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

我发现一篇文章引用了关于DLLsearch顺序的MSDN文章

对于托pipe代码依赖性,全局程序集caching始终占上风; 如果GAC中存在(或更新的策略)副本,应用程序目录中的本地程序集将不会被拾取。

考虑到这一点,我猜测MSDN列表是正确的一个补充

 全局程序集caching 

“加载DLL时不再是当前search的目录!这个改变也是在Windows XP SP1中进行的。现在的默认行为是首先查看所有的系统位置,然后是当前目录,最后是任何用户定义的path。 “

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

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