.NET程序集策略浅析

一、两种程序集

  .NET框架支持两种程序集“弱命名程序集”和“强命名程序集”。

  两者在结构上是相同的,也就是说,它们使用同样的文件格式。二者之间真正区别在于强命名程序集有一个发布者的公钥/私钥对签名,其中的公钥/私钥对唯一地标识了程序集的发布者。利用公钥/私钥对我们可以对程序集进行唯一的标识、安全策略和版本策略,从而可以将其部署在用户硬盘的任何地方,甚至是互联网上。

一般地,我们在VS2003中编译一个项目,会生成一个程序集文件,该程序集文件为“弱命名程序集”。若要生成强命名程序集,则需要按如下步骤操作:

1、使用“Visual Studio .NET 2003 命令提示”工具,如下图所示:

2、使用SN.EXE(VS2003自带的“强命名程序集”公钥/私钥对生成工具)生成一个密匙文件,如下图红线区域所示:

上图中余下两行命令为查看公匙的命令。

               

  3、编辑项目中的AssemblyInfo.cs文件,写入如下行到文件中(VS2003生成该文件时,已经自动创建了该行模板,只需修改该行即可):

4、编译程序集,完成该步骤之后,所生成的DLL便是一个“强命名程序集”类型的文件了。一个正确的“强命名程序集”文件至少包含如下的四个属性:

二、为什么要使用“强命名程序集”

  不同的公司可能会开发出有相同名字的程序集来,如果这些程序集都被复制到同一个相同的目录下,最后一个安装的程序集将会代替前面的程序集。这就是著名的Windows DLL Hell”出现的原因。很明显,简单的用文件名来区分程序集是不够的,CLR需要支持某种机制来唯一的标识一个程序集。这就是所谓的强命名程序集。一个强命名程序集包含四个唯一标志程序集的特性:文件名(没有扩展名),版本号,语言文化信息(默认为neutral),公匙标记。这些信息存储在程序集的清单(manifest)中。清单包含了程序集的元数据,并嵌入在程序集的某个文件中。

  

   下面的字符串标识了四个不同的程序集文件信息(依次为文件名(没有扩展名),版本号,语言文化信息(默认为neutral),公匙标记):

  

   “MyType, Version= 1.0.1.0, Culture=neutral, PublicKeyToken=bf5779af662fc 055”

  

   “MyType, Version= 1.0.1.0, Culture=en-us, PublicKeyToken=bf5779af662fc 055”

  

   “MyType, Version= 1.0.2.0, Culture=neturl, PublicKeyToken=bf5779af662fc 055”

  

   “MyType, Version= 1.0.2.0, Culture=neutral, PublicKeyToken=dbe 4120289f9fd 8a”

  

如果一个公司想唯一的标识它的程序集,那么它必须首先获取一个公钥/私钥对,然后将共有秘钥和程序集相关联(即上文中使用SN.EXE生成密匙对的过程)。不存在两个公司有同样的公钥/私钥对的情况,正是这种区分使得我们可以创建有着相同名称,版本和语言文化信息的程序集,而不引起任何冲突。

三、两种部署方式(私有部署和全局部署)

程序集有两种部署方式:

a)私有方式

和应用程序部署在同一目录下的程序集称作私有部署程序集。弱命名程序集只能进行私有部署。该方式符合.NET框架简单拷贝部署的许诺。

b)全局方式

全局部署方式将程序集部署在一些CLR已确知的地方(一般部署到全局缓存,简称GAC)。当CLR搜索程序集时,它会知道到这些地方去找。强命名程序集既可以进行私有部署,也可以进行全局部署。

将程序集安装到GAC进行全局方式的部署中有几个好处。首先,GAC使得很多应用程序可以共享程序集,这从整体上减少了使用的物理内存。其次,我们很容易将一个新版的程序集部署到GAC中,并允许所有的应用程序来使用这个新的版本。最后,GAC还提供了对不同版本程序集的并存管理方式。

然而,并不是所有部署都应该使用全局的方式。实际上,仅当程序集被多个应用程序共享时,才可考虑将它们部署到GAC中。如果程序集不太可能被共享,我们应该以私有方式来部署它。私有部署实现了“简单”拷贝安装部署的目标,也为应用程序和程序集提供了一个更好的隔离方式。另外对于普通文件,我们不应该将GAC当作类似的倾倒场所,这是因为新版的程序集不会覆盖旧版的程序集,它们会以并存方式安装,非常耗费磁盘空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值