.Net程序集入门

                                     **摘要**

.NET 程序集的作用: 能够做到与语言无关的代码重用。
.NET 程序集是可版本化的单元,是自描述的,可配置的。
.NET 程序集的格式:
1. window文件首部 (标识了程序以什么类型,形式驻留与window操作系统)
2. CLR文件代码 (托管文件的布局分布)
3. CIL代码 (独立于平台与CPU的中间语言)
4. 类型元数据 (描述了程序集内含类型与引用外部类型的格式)
5. 程序集清单 (用于定位外部程序集的引用,自身程序集的模块)
6. 可选的嵌入资源 (程序图片,图像文件,声音片段, )

私有程序集与共享程序集介绍


                                      **程序集清单**

使用反汇编工具(ildasm.exe)观察,可执行的文件的程序集清单
1. 点击file (选择要观察的.exe文件)
2. 点击MANIFST选项,弹出该.exe文件的程序集清单;如图所示:

图中每个块都有由.publickeytoken与.ver组成,分别表示程序集被配置成强名称(以后介绍),数                    字版本标识。

       图中每个块都有由.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中。

强名称组成

  1. 程序集友好名称
  2. 程序集版本号 (清单中的.very值,前面提到过)
  3. 公钥值 (清单中的.publickeytoken值)
  4. 用于本地化的可选区域性标识 (使用【AssemblyCulture】特性赋值)
  5. 数字签名

生成强名称

  1. 首先需要使用sn.exe工具生成 公钥/私钥对。
  2. C#编译器会基于程序集的清单,CIL(带有公钥),类型数据生成程序集散列码。
  3. 私钥数据与程序集散列码组成数字签名,嵌入到程序集中。
  4. 具体的我们可以在【解决方案资源管理器 】-【属性页】-【signing】为程序集生成强名称

安装强名称程序集
使用.NET FrameWork 4.5 SDK提供的gacutila.exe工具,输入/?查看操作方式。

  1. -i 表示安装
  2. -u 表示卸载
  3. -l 用于判断安装是否成功

使用共享程序集时,仍需添加相应的引用


发行者策略程序集
当程序的最新程序集版本更新到GAC时,把一个*config文件的二进制版本也安装到GAC。
这样客户端程序目录就不需要包含任何.config 文件,因为CLR在查询程序清单的时候,会先执行GAC级别的.config文件(即发行者策略程序集)

好处:

  1. 程序小白在使客户端程序时,不需要手动的为最新程序版本配置.config文件。
  2. 只要新版本的程序集安装到GAC中,则原来有缺陷的客户端程序不需要重新编译生成和发布。

其他
我们不能100%的保证,发行者策略程序集适合所有的用户。所以针对于发行者程序集策略无法正常使用的情况,我们需要禁止发行者程序集策略,让程序能够使用原来的版本

可以指示CIL探索任何位置的程序集,包括位于远程计算机的程序集,前提是该程序集具有强名称。详细情况可以查看system.Configration命名空间

参考书籍《精通C#》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值