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
C#程序集系列12,C#编译器和CLR如何找寻程序集的更多相关文章
- C#程序集系列13,如何让CLR选择不同版本的程序集
本篇主要体验,在存在多个版本程序集的情况下,如何让CLR选择哪个版本程序集运行,以及程序集版本的切换. 分别生成非强名称程序集不同版本 □ 生成某个版本的程序集 →清理F盘as文件夹,剩下如下文件 → ...
- C#程序集系列11,全局程序集缓存
全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集.当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集. 为什么需要全局程 ...
- C#程序集系列10,强名称程序集
当一个程序集的名称,版本,文化,Public Key都做了设置,就可以把这个程序集叫做"强名称程序集".强名称程序集可以防止被仿冒或篡改.本篇首先创建一个强名称程序集,接着模拟篡改 ...
- C#程序集系列09,程序集签名
在"C#程序集系列08,设置程序集版本"中体验了为程序集设置版本,但对于程序集的安全性来说,还远远不够.本篇体验程序集的签名. □ 程序集的签名 →F盘as文件夹下有多个文件→在程 ...
- C#程序集系列08,设置程序集版本
区别一个程序集,不仅仅是程序集名称,还包括程序集版本.程序集公匙.程序集文化等,本篇体验通过界面和编码设置程序集版本. □ 通过Visual Studio设置程序集版本 →右键项目,选择"属 ...
- C#程序集系列07,篡改程序集
以下几个方面用来区分不同的程序集:○ 程序集名称:Name○ 程序集版本:Version○ 程序集公匙: Public Token○ 程序集文化:Culture 如果没有很严格地按照上面的几个方面来创 ...
- C#程序集系列06,程序集清单,EXE和DLL的区别
CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/ 程序集清单 □ 查看程序集清单 →清空F盘as文件夹中的所有内容→创建MainClass.cs文件→ ...
- C#程序集系列05,让程序集包含多个module
本篇体验在一个程序集中包含多个module. □ 创建3个module →删除F盘as文件夹中的一些文件,只剩下如下3个文件→用记事本打开MyFirstModule.cs文件,修改如下,并保存 usi ...
- C#程序集系列04,在程序集包含多个module的场景下理解关键字internal
本篇在一个程序集包含多个module的场景下体验internal的含义. →查看F盘as文件夹下的文件→删除MainClass.exe→把MyFirstModule和MySecondModule组装到 ...
随机推荐
- AdvStringGrid 单元格字体颜色、背景颜色
procedure TForm5.Button1Click(Sender: TObject); var I: Integer; begin AdvStringGrid1.RowCount := ;// ...
- centos7 vnc 无法systemctl启动
1.centos7 vnc 无法systemctl启动 报错如下:Failed to start Remote desktop service (VNC) 2.解决办法 错误服务脚本名 vncserv ...
- Kubernetes1.6集群上(开启了TLS)安装Dashboard
本节内容: 配置dashboard 执行所有定义的文件 检查执行结果 访问dashboard 这是接着上一篇<二进制方式部署Kubernetes 1.6.0集群(开启TLS)>写的.Kub ...
- HTML5移动应用左右滑动touchmove touchmove touchend 实例
也是刚开始接触移动前端,大虾别喷 <!DOCTYPE HTML> <html> <head> <meta name="viewport" ...
- python使用cookie登陆网页
python2: Python 爬虫入门六之 Cookie 的使用 python3: Python3 网络爬虫 (六):Python3 使用 Cookie - 模拟登陆获取妹子联系方式 python ...
- 老的API实现WordCount
使用Hadoop版本0.x实现单词统计 package old; import java.io.IOException; import java.net.URI; import java.util.I ...
- Dubbo中多协议
Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议 1.不同服务不同协议配置 不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议 & ...
- 003 Ajax中传输格式为XML
一: 1.优缺点 二:大纲 1.结构设计 三:程序 1.xml <?xml version="1.0" encoding="utf-8"?> < ...
- Python并发编程系列之协程
1 引言 协程是近几年并发编程的一个热门话题,与Python多进程.多线程相比,协程在很多方面优势明显.本文从协程的定义和意义出发,结合asyncio模块详细讲述协程的使用. 2 协程的意义 2.1 ...
- C#连接操作MySQL数据库详细步骤 帮助类等(二次改进版)
最近准备写一个仓库管理的项目 客户要求使用C#编写MySQL存储数据 为了方便,整理了数据库操作的工具类 首先在项目App.config 文件下添加节点 <connectionStrings&g ...