C#程序集系列12,C#编译器和CLR如何找寻程序集
本篇体验C#编译器和CLR运行时如何查找程序集,并自定义CLR运行时查找程序集的方式。
□ C#编译器和CLR运行时如何查找程序集
C#编译器在哪里?
--在C:\Windows\Microsoft.NET\Framework\v4.0.30319中
→删除F盘as文件夹中所有的exe和dll文件
→把上一篇全局程序集缓存文件夹(C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Farm\v4.0_3.3.3.3__863de8402b3a9978)中的Farm.dll剪切拷贝到C:\Windows\Microsoft.NET\Framework\v4.0.30319文件夹中,即把Farm.dll放到C#编译器csc.exe所在文件夹
现在,Farm.dll既不再全局程序集缓存文件夹,也不在F盘as文件夹中,和csc.exe在同一个文件夹中。
→F盘的as文件夹中也没有Farm.dll
→重新编译MainClass.cs
→但是,运行MainClass.exe,却报错
这说明:以上编译成功,意味着C#编译器能找到其所在文件夹内的Farm.dll程序集;但,CLR运行时却"不认识"这个Farm.dll程序集。
因为,CLR运行时会到MainClass.exe所在的文件夹中去搜索Farm.dll,没有搜寻到,所以报错。
→现在把csc.exe所在文件夹的Farm.dll拷贝到F盘的as文件夹中
→再次运行MainClass.exe
这印证了:CLR运行时会在可执行文件所在文件夹搜寻程序集。
所以,
C#编译器查找程序集的顺序是:
1、在C#编译器所在文件夹中查找
2、在全局程序集缓存文件夹中查找(该文件夹中的程序集必须是强名称)
3、在可执行文件所在文件夹查找
CLR运行时查找程序集的顺序是:
1、在全局程序集缓存文件夹中查找(该文件夹中的程序集必须是强名称)
2、在可执行文件所在文件夹查找
□ 自定义CLR运行时查找程序集的方式
→查看F盘as文件夹中的当前文件
→创建MyAssemblies文件夹
→把Farm.dll移动到新创建的MyAssemblies文件夹
→运行MainClass.exe,发现报错
→在as文件夹中创建MainClass.exe.config文件
→用记事本打开,编写如下,保存
<?xml version="1.0" encoding="utf-8" ?><configuration><runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="MyAssemblies" />
</assemblyBinding></runtime></configuration>
→再次运行MainClass.exe,一切正常
总结:
○ .NET搜寻程序集的时候是忽略后缀的,即Farm.dll和Farm.exe一样能被找到
○ C#编译器和CLR运行时,查找程序集的方式有所不同
○ 在"可执行文件名称.exe.config"中设置CLR运行时查找程序集的方式
“C#程序集系列”包括:
C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序
C#程序集系列02,使用记事本查看可执行程序集的IL代码
C#程序集系列03,引用多个module
C#程序集系列04,在程序集包含多个module的场景下理解关键字internal
C#程序集系列05,让程序集包含多个module
C#程序集系列06,程序集清单,EXE和DLL的区别
C#程序集系列07,篡改程序集
C#程序集系列08,设置程序集版本
C#程序集系列09,程序集签名
C#程序集系列10,强名称程序集
C#程序集系列11,全局程序集缓存
C#程序集系列12,C#编译器和CLR如何找寻程序集
C#程序集系列13,如何让CLR选择不同版本的程序集
参考资料:
http://www.computersciencevideos.org/ created by Jamie King