**摘要**
.NET 程序集的作用: 能够做到与语言无关的代码重用。
.NET 程序集是可版本化的单元,是自描述的,可配置的。
.NET 程序集的格式:
1. window文件首部 (标识了程序以什么类型,形式驻留与window操作系统)
2. CLR文件代码 (托管文件的布局分布)
3. CIL代码 (独立于平台与CPU的中间语言)
4. 类型元数据 (描述了程序集内含类型与引用外部类型的格式)
5. 程序集清单 (用于定位外部程序集的引用,自身程序集的模块)
6. 可选的嵌入资源 (程序图片,图像文件,声音片段, )
私有程序集与共享程序集介绍
**程序集清单**
使用反汇编工具(ildasm.exe)观察,可执行的文件的程序集清单
1. 点击file (选择要观察的.exe文件)
2. 点击MANIFST选项,弹出该.exe文件的程序集清单;如图所示:
图中每个块都有由.publickeytoken与.ver组成,分别表示程序集被配置成强名称(以后介绍),数 字版本标识。
同时我们会发现很多.custom标识(可在项目中的AssemblyInfo.cs中发现),它们标识了程序集级别的特性(关于特性,以后介绍)
3. 可以在点击 “解决方案资源管理器 ” 中的属性图标,在单击“应用程序”页面中的“程序集信 息”,可视化的设置上述相关的内容
**CIL **
CIL是独立于平台的指令,当.NET运行库把一个程序集添加到内存的时候,CIL会被编译成目标平台可以理解的指令
理解CIL语法有助于构建复杂的高级服务应用程序,CIL语法以后再涉及
**程序集的配置**
简单的介绍了程序集中所包含的内容后,接下来介绍程序集在应用程序中的配置
私有程序集
当一个客户端程序使用定义在外部程序集的类型的时候,.Net运行库查找被引用的程序集时并不查询系统注册表
因此我们可以将需要用到的程序集放到应用程序的目录下,这被称为Xcopy部署 。该程序成为私有程序集。
卸载私有程序集很简单,直接删除文件就行,不会影响其程序的运行
私有程序集的标识
私有程序集的标识包括:友好名称与数字版本号
私有程序集的探测
把私有程序集放到正确的位置后,.NET运环境会解析该程序集的位置。这种探测有两种方式:
隐式加载请求:在CLR查询清单的.Assembly extern标记来解析程序集位置的时候。自动请求
显示加载请求: 以编程的方式调用 System.Reflection.Assembly类的load();
当在应用程序目录下找不到被请求的程序集时,CLR会尝试查找该目录下具有被请求程序集友好名称的子目录。
私有程序集的配置
1,添加对程序集的引用:选中要添加引用的项,右键,选择添加引用,找到要引用的程序集点击确定。(程序集会自动被添加到应用程序目录下)
2,当需要把私有程序集放到应用程序目录下的不同子目录的时候,可以通过新建一个.exe.config文件进行配置。
该文件中的probing
用于指明程序应该哪个子目录下进行探测。ex:<probing privatepath="mylib;mybib/bin">
探测多个目录用分号隔开
3,我们也可以通过程序中的APP.config文件实现上述2的目标,当我们对APP.config进行修改的时候,
VS会自动的生成相应的.exe.config文件。
共享程序集
位于全局程序集缓存(GAC),可供机器上多个程序使用的程序集被称为共享程序集.
GAC在.NET1.0到.NET3.5版本时,位于C:\Windows\assembly中;在.NET4.0时位于C:\Windows\Microsoft.net\asssembly\GAC_MSIL中。
强名称组成
- 程序集友好名称
- 程序集版本号 (清单中的.very值,前面提到过)
- 公钥值 (清单中的.publickeytoken值)
- 用于本地化的可选区域性标识 (使用【AssemblyCulture】特性赋值)
- 数字签名
生成强名称
- 首先需要使用sn.exe工具生成 公钥/私钥对。
- C#编译器会基于程序集的清单,CIL(带有公钥),类型数据生成程序集散列码。
- 私钥数据与程序集散列码组成数字签名,嵌入到程序集中。
- 具体的我们可以在【解决方案资源管理器 】-【属性页】-【signing】为程序集生成强名称
安装强名称程序集
使用.NET FrameWork 4.5 SDK提供的gacutila.exe工具,输入/?查看操作方式。
- -i 表示安装
- -u 表示卸载
- -l 用于判断安装是否成功
使用共享程序集时,仍需添加相应的引用
发行者策略程序集
当程序的最新程序集版本更新到GAC时,把一个*config文件的二进制版本也安装到GAC。
这样客户端程序目录就不需要包含任何.config 文件,因为CLR在查询程序清单的时候,会先执行GAC级别的.config文件(即发行者策略程序集)
好处:
- 程序小白在使客户端程序时,不需要手动的为最新程序版本配置.config文件。
- 只要新版本的程序集安装到GAC中,则原来有缺陷的客户端程序不需要重新编译生成和发布。
其他
我们不能100%的保证,发行者策略程序集适合所有的用户。所以针对于发行者程序集策略无法正常使用的情况,我们需要禁止发行者程序集策略,让程序能够使用原来的版本
可以指示CIL探索任何位置的程序集,包括位于远程计算机的程序集,前提是该程序集具有强名称。详细情况可以查看system.Configration命名空间
参考书籍《精通C#》