c# NET CLR Assembly 搜索程序集的位置顺序

网上讲得其实都不太全,是残缺的。

而一般大家在处理时,都不涉及到程序集版本问题,所以本例中,不涉及到版本程序集重定向问题。

照例,直接给结论:

假设需要搜索的是C.dll ,那么程序集搜索位置和顺序是:

1.GAC

2.AppBase:即AppName.exe 所在路径

3.配置文件中配置的privatePath,从前往后的次序。注意,这个配置文件,还包含Machine.config的全局配置。

4.当前程序集B.dll所在路径 BPath。这个以前没有注意到,导致程序出错,调试了两天,没搞清楚。后来猜想应该包含这个路径,验证了一下,确实如此。简单解释一下。AppName.exe 引用了 B.dll,找到B.dll,比如说路径是BPath,然后执行B.dll里的b()方法,此时,引用了C.dll的类型,需要搜索C.dll,那么B.dll所在的路径BPath,将也被包含在搜索路径中。这个路径的优先级排在第四位。

5.注意,以上2.3.4 在未搜索到目标dll时,会自动在该路径后,再加一段路径,在进行搜索。搜索不到时,才会向下走。例如,AppName.exe所在路径AppBase找不到时,会在AppBase\AppName中搜索。找不到时,会,继续在privatePath中依次寻找,找不到时,会在privatePath\AppName再找一下。还找不到,就到BPath,还找不到就是BPath\AppName

6.AssemblyResolve事件。

7、另外,在搜索程序集时,会丢掉后缀,然后分别以exe和dll搜索一遍。

整理一下顺序:

1、GAC

2、AppBase

3、AppBase\AppName

4、privatePath

5、privatePath\AppName

6、以上,按照dll搜索一遍之后,会换成exe再搜索一遍。

7、BPath

8、BPath\AppName

9、此时,按照dll搜索完BPath和BPath\AppName后,再按exe搜一遍。

10、AssemblyResolve

你可能感兴趣的:(.Net,基础,c#,microsoft,clr,.net)