如何强命名程序集(转)

强命名程序集的缘由

      目前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

posted @ 2011-04-26 12:14  贝加  阅读(940)  评论(0编辑  收藏  举报