如何强命名程序集(转)
强命名程序集的缘由:
目前Windows中出现的DLL Hell问题(两个不同的公司可能开发处具有相同名称的程序集,如果将相同名称的程序集放置到同一个目录下,则会出现程序集覆盖现象,最后安装的程序集会覆盖前面的程序集,从而可能导致应用序不能正常运行)。由此看来,仅靠名称来区分程序集是不足够的。CLR采取了强命名程序集的方式来唯一的表示程序集。
强命名程序集包含四个标识:名称,版本号,语言文化标识和一个共有/私有密钥对。
两种程序集/两种部署方式:
.Net支持两种程序集:弱命名程序集和强命名程序集(注:.Net框架中没有弱命名程序集,只是为了和强命名程序集相对应而已)。弱命名程序集和强命名程序集在结构上是相同的。他们都采用PE文件格式,包含PE表头,CLR表头,元数据和清单表。区别在于:强命名程序集拥有一个发布者的公钥/私钥签名对,他们用于唯一的标识程序集的发布者。通过公钥/私钥对,我们可以对程序集进行唯一的标识,安全策略和版本策略。
程序集的部署方式也有两种:私有部署和全局部署。
私有部署方式是:把程序集部署到应用程序的相关目录下。弱命名程序集只能进行私有部署。
全局部署方式是:把程序集部署到CLR知道的地方,CLR可以到这个地方查找到需要的程序集。强命名程序集可以进行两种部署。
程序集种类 是否可以进行私有部署 是否可以进行全局部署
弱命名程序集 是 否
强命名程序集 是 是
为什么要生成强命程序集?
命名程序集可以防止程序集被篡改,强命名的程序集可以部署到GAC中,共享多个版本的程序集。如果希望一个程序集被多个应用程序访问,则程序集必须被放到一个CLR已经确知的目录下,从而能够自动到该目录找到该程序集。这个确知的目录称作全局程序集缓存(Global Assembly Cache),通常位于:C\Wndows\Assembly下。
怎么样生成强命名程序集?
1.生成密钥
运行Visual Studio .NET 2003 命令提示行
输入:存放密钥的路径>sn -k 密钥文件名
例如:D:\>sn -k mykey.key
2.使用密钥
把密钥文件放到解决方案的根目录下,打开解决方案,修改要强命名项目的AssemblyInfo.cs文件
[assembly: AssemblyVersion("1.0.0.1")] //强命名程序集一般都指定版本号
[assembly: AssemblyDelaySign(false)] //是否要延迟签名 false:不延迟签名 true:延迟签名
[assembly: AssemblyKeyFile("mykey.key")] //密钥文件的路径
3.生成强名称程序集
编译解决方案,这样生成的程序集就是强命名的程序集了
4.部署强命名程序集到GAC中
(我们可以使用工具GACUtil.exe,指定/i命令开关将一个程序集安装到GAC中。
同样可以使用/u命令开关将一个程序集从GAC中卸载)
运行Visual Studio .NET 2003 命令提示行
输入:任意路径>gacutil /i 强命名程序所在的绝对路径
例如:D:\>gacutil /i E:\我的默认网站\myweb\myAssembly.dll
注意:只有强命名的程序集才可以部署到GAC中(GAC:全局程序集缓冲)
本文参考地址1:http://blog.csdn.net/lchunl9707/archive/2009/06/16/4274185.aspx
本文参考地址2:http://blog.csdn.net/calm_agan/archive/2006/01/07/572716.aspx