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

C#程序集系列12,C#编译器和CLR如何找寻程序集的更多相关文章

  1. C#程序集系列13,如何让CLR选择不同版本的程序集

    本篇主要体验,在存在多个版本程序集的情况下,如何让CLR选择哪个版本程序集运行,以及程序集版本的切换. 分别生成非强名称程序集不同版本 □ 生成某个版本的程序集 →清理F盘as文件夹,剩下如下文件 → ...

  2. C#程序集系列11,全局程序集缓存

    全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集.当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集. 为什么需要全局程 ...

  3. C#程序集系列10,强名称程序集

    当一个程序集的名称,版本,文化,Public Key都做了设置,就可以把这个程序集叫做"强名称程序集".强名称程序集可以防止被仿冒或篡改.本篇首先创建一个强名称程序集,接着模拟篡改 ...

  4. C#程序集系列09,程序集签名

    在"C#程序集系列08,设置程序集版本"中体验了为程序集设置版本,但对于程序集的安全性来说,还远远不够.本篇体验程序集的签名. □ 程序集的签名 →F盘as文件夹下有多个文件→在程 ...

  5. C#程序集系列08,设置程序集版本

    区别一个程序集,不仅仅是程序集名称,还包括程序集版本.程序集公匙.程序集文化等,本篇体验通过界面和编码设置程序集版本. □ 通过Visual Studio设置程序集版本 →右键项目,选择"属 ...

  6. C#程序集系列07,篡改程序集

    以下几个方面用来区分不同的程序集:○ 程序集名称:Name○ 程序集版本:Version○ 程序集公匙: Public Token○ 程序集文化:Culture 如果没有很严格地按照上面的几个方面来创 ...

  7. C#程序集系列06,程序集清单,EXE和DLL的区别

    CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/ 程序集清单 □ 查看程序集清单 →清空F盘as文件夹中的所有内容→创建MainClass.cs文件→ ...

  8. C#程序集系列05,让程序集包含多个module

    本篇体验在一个程序集中包含多个module. □ 创建3个module →删除F盘as文件夹中的一些文件,只剩下如下3个文件→用记事本打开MyFirstModule.cs文件,修改如下,并保存 usi ...

  9. C#程序集系列04,在程序集包含多个module的场景下理解关键字internal

    本篇在一个程序集包含多个module的场景下体验internal的含义. →查看F盘as文件夹下的文件→删除MainClass.exe→把MyFirstModule和MySecondModule组装到 ...

随机推荐

  1. AdvStringGrid 单元格字体颜色、背景颜色

    procedure TForm5.Button1Click(Sender: TObject); var I: Integer; begin AdvStringGrid1.RowCount := ;// ...

  2. centos7 vnc 无法systemctl启动

    1.centos7 vnc 无法systemctl启动 报错如下:Failed to start Remote desktop service (VNC) 2.解决办法 错误服务脚本名 vncserv ...

  3. Kubernetes1.6集群上(开启了TLS)安装Dashboard

    本节内容: 配置dashboard 执行所有定义的文件 检查执行结果 访问dashboard 这是接着上一篇<二进制方式部署Kubernetes 1.6.0集群(开启TLS)>写的.Kub ...

  4. HTML5移动应用左右滑动touchmove touchmove touchend 实例

    也是刚开始接触移动前端,大虾别喷 <!DOCTYPE HTML> <html> <head> <meta name="viewport" ...

  5. python使用cookie登陆网页

    python2: Python 爬虫入门六之 Cookie 的使用 python3: Python3 网络爬虫 (六):Python3 使用 Cookie - 模拟登陆获取妹子联系方式 python ...

  6. 老的API实现WordCount

    使用Hadoop版本0.x实现单词统计 package old; import java.io.IOException; import java.net.URI; import java.util.I ...

  7. Dubbo中多协议

    Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议 1.不同服务不同协议配置 不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议 & ...

  8. 003 Ajax中传输格式为XML

    一: 1.优缺点 二:大纲 1.结构设计 三:程序 1.xml <?xml version="1.0" encoding="utf-8"?> < ...

  9. Python并发编程系列之协程

    1 引言 协程是近几年并发编程的一个热门话题,与Python多进程.多线程相比,协程在很多方面优势明显.本文从协程的定义和意义出发,结合asyncio模块详细讲述协程的使用. 2 协程的意义 2.1 ...

  10. C#连接操作MySQL数据库详细步骤 帮助类等(二次改进版)

    最近准备写一个仓库管理的项目 客户要求使用C#编写MySQL存储数据 为了方便,整理了数据库操作的工具类 首先在项目App.config 文件下添加节点 <connectionStrings&g ...