C#程序集系列12,C#编译器和CLR如何找寻程序集

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: 小 | 中 | 大 | 超大  

本篇体验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文件

→用记事本打开,编写如下,保存

<?xmlversion="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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有