强命名程序集的缘由:
目前Windows中出现的DLL Hell问题(两个不同的公司可能开发处具有相同名称的程序集,如果将相同名称的程序集放置到同一个目录下,则会出现程序集覆盖现象,最后安装的程序集会覆盖前面的程序集,从而可能导致应用序不能正常运行)。由此看来,仅靠名称来区分程序集是不足够的。CLR采取了强命名程序集的方式来唯一的表示程序集。强命名程序集包含四个标识:名称,版本号,语言文化标识和一个共有/私有密钥对。
两种程序集/两种部署方式:
.Net支持两种程序集:弱命名程序集和强命名程序集(注:.Net框架中没有弱命名程序集,只是为了和强命名程序集相对应而已)。弱命名程序集和强命名程序集在结构上是相同的。他们都采用PE文件格式,包含PE表头,CLR表头,元数据和清单表。区别在于:强命名程序集拥有一个发布者的公钥/私钥签名对,他们用于唯一的标识程序集的发布者。通过公钥/私钥对,我们可以对程序集进行唯一的标识,安全策略和版本策略。
程序集的部署方式也有两种:私有部署和全局部署。私有部署方式是:把程序集部署到应用程序的相关目录下。弱命名程序集只能进行私有部署。全局部署方式是:把程序集部署到CLR知道的地方,CLR可以到这个地方查找到需要的程序集。强命名程序集可以进行两种部署。
程序集种类 是否可以进行私有部署 是否可以进行全局部署 弱命名程序集 是 否
强命名程序集 是 是
如何创建强命名程序集:
1:使用强命名工具(Strong Name Utility)产生密钥对。
例如:SN -K MyCompany.keys
2:在源代码Assembly.cs中设置AssemblyKeyFile属性
例如:[assembly:AssemblyKeyFile("MyCompany.keys");
3:重新编译,产生的程序集就是经过签名后的程序集了。
如何部署强命名程序集(全局部署):
如果希望一个程序集被多个应用程序访问,则程序集必须被放到一个CLR已经确知的目录下,从而能够自动到该目录找到该程序集。这个确知的目录称作全局程序集缓存(Global Assembly Cache),通常位于:C/Wndows/Assembly下。
我们可以使用工具GACUtil.exe,指定/i命令开关将一个程序集安装到GAC中。同样可以使用/u命令开关将一个程序集从GAC中卸载。注意:安装的程序集必须是强命名程序集。