本篇体验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. SQL语句添加删除修改字段

    用SQL语句添加删除修改字段1.增加字段     alter table docdsp    add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME ...

  2. Pyhton核心编程-Chap2习题-DIY

    在学Python,在看<Python核心编程>的pdf,做了Chap2的题目,答案为DIY # Filename: 2-11.py # Author: ChrisZZ mylist = [ ...

  3. 标准C++中的String类的使用

    要使用标准C++中的String类,必须包含#include<string>(注意不是<string.h>带.h的是C语言中的头文件) 作者:耑新新,发布于  博客园 转载请注 ...

  4. Spark(十四)SparkStreaming的官方文档

    一.SparkCore.SparkSQL和SparkStreaming的类似之处 二.SparkStreaming的运行流程 2.1 图解说明 2.2 文字解说 1.我们在集群中的其中一台机器上提交我 ...

  5. 2588: Count on a tree

    敢问和zwt的树有何区别..改了读入直接交..四百个人A,三百多个PE..于是果断贡献几发PE.. http://ideone.com/9XCg3D

  6. bzoj 4552

    4552 思路: 二分线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define ...

  7. 解析文本文件 "r" 与 "rb" 模式的区别(Python)

    r,rb 那么在读文件时,有无b标识的的主要区别在哪里呢? 1.文件使用方式标识 'r':默认值,表示从文件读取数据.'b':表示要读写二进制数据 2.读文件 进行读文件操作时,直到读到文档结束符(E ...

  8. HTML5 Canvas游戏开发(四)lufylegend开源库件(下)

    一.文本 LTextField对象是lufylegend库件中专门用于显示文本信息的一个对象. 1.文本属性 创建的文本框对象不会自动加入可视化对象列表中.只有手动调用addChild()方法才能使它 ...

  9. 安装CDM遇到的坑

    其实主要就是一个坑,就是版本不对应的问题. 我的环境是centos6.5,而官方提供的版本是分别针对centos6和centos5的,之前我进行软件实施的时候,下载的是centos5...... ht ...

  10. java 代码中设置 临时 环境变量

    System.setProperty("hadoop.home.dir", "D:\\software\\software_install\\dev_install\\h ...