码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-14 15:19:37      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   文件   2014   

本篇体验C#编译器和CLR运行时如何查找程序集,并自定义CLR运行时查找程序集的方式。

 

□ C#编译器和CLR运行时如何查找程序集

C#编译器在哪里?
--在C:\Windows\Microsoft.NET\Framework\v4.0.30319中
bubuko.com,布布扣

→删除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所在文件夹
bubuko.com,布布扣
现在,Farm.dll既不再全局程序集缓存文件夹,也不在F盘as文件夹中,和csc.exe在同一个文件夹中。
→F盘的as文件夹中也没有Farm.dll
bubuko.com,布布扣
→重新编译MainClass.cs
bubuko.com,布布扣
→但是,运行MainClass.exe,却报错
bubuko.com,布布扣

这说明:以上编译成功,意味着C#编译器能找到其所在文件夹内的Farm.dll程序集;但,CLR运行时却"不认识"这个Farm.dll程序集。
因为,CLR运行时会到MainClass.exe所在的文件夹中去搜索Farm.dll,没有搜寻到,所以报错。
→现在把csc.exe所在文件夹的Farm.dll拷贝到F盘的as文件夹中
→再次运行MainClass.exe
bubuko.com,布布扣
这印证了:CLR运行时会在可执行文件所在文件夹搜寻程序集。


所以,

C#编译器查找程序集的顺序是:
1、在C#编译器所在文件夹中查找
2、在全局程序集缓存文件夹中查找(该文件夹中的程序集必须是强名称)
3、在可执行文件所在文件夹查找

 

CLR运行时查找程序集的顺序是:
1、在全局程序集缓存文件夹中查找(该文件夹中的程序集必须是强名称)
2、在可执行文件所在文件夹查找

 

□ 自定义CLR运行时查找程序集的方式

→查看F盘as文件夹中的当前文件
bubuko.com,布布扣
→创建MyAssemblies文件夹
bubuko.com,布布扣

→把Farm.dll移动到新创建的MyAssemblies文件夹
bubuko.com,布布扣
→运行MainClass.exe,发现报错
bubuko.com,布布扣
→在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,一切正常
bubuko.com,布布扣

 


总结:
○ .NET搜寻程序集的时候是忽略后缀的,即Farm.dll和Farm.exe一样能被找到
○ C#编译器和CLR运行时,查找程序集的方式有所不同
○ 在"可执行文件名称.exe.config"中设置CLR运行时查找程序集的方式

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

标签:style   blog   http   color   io   os   ar   文件   2014   

原文地址:http://www.cnblogs.com/darrenji/p/3971025.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!