强命名程序集及其部署
2007-04-09 14:26
197 查看
我们知道,以前在Windows下开发程序时常会遭遇著名的“DLLHell”问题,即动态链接库的向后兼容问题。微软在.Net产生前曾尝试使用COM组件的方式来解决DLLHell问题,即使用Guid来唯一的标识每一个COM组件。但是,实际上使用COM组件(包括版本升级)也是一件颇为麻烦的事:为了运行COM组件就必须在组册表中对其进行注册,重新编译有可能破坏Guid从而导致原来引用此COM组件的程序不能正确运行,等等。
在.Net中,微软引入了一种新的解决方案:强命名程序集(StrongName),以及与之配套的全局程序集缓存(GAC)来解决这个问题。
我们知道,.Net使用Name、Version、Culture、PublicToken四个属性来唯一标识一个程序集,而不同产品前三个属性(Name、Version和Culture)完全相同的情况是有可能发生的,如此一来,这唯一标识程序集可重任就落到PublicToken的头上了。强命名的程序集正是使用RSA来保证PublicToken的唯一性,因为在理论上,非对称算法RSA生成的公钥/私钥对不会重复。.Net正是通过在编译项目时将指定的公钥/私钥对写入程序集来保证其唯一性。
对于全局程序集缓存(GAC),MSDN是这样介绍的:安装有公共语言运行库的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存。全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集。
在开发一般的、非共享的程序时,我们不需要使用强命名的程序集,仅将项目(Project)编辑成.DLL或者.EXE即可。但是,如果我们开发的是组件库、框架时,通过对程序集进行强命名,并使用将其部署到GAC中,可以保证我们的程序集不会出现版本问题。
那么,如何创建强命名的程序集呢?以下是其步骤
使用SN工具来生成密钥对。该工具位于安装.NETFrameworkSDK的Bin目录中,在命令行中使用“SN-k[驱动器号]:[放置密钥的目录][密钥名称].snk”这样的语句可以生成密钥对。如,我们使用SN-kC:\MySloutionKey.snk,可以把名为MySloutionKey.snk的密钥对文件生成到C盘根目录下;
此时,该密钥对并未与项目的程序集建立关联,我们需要打开项目(Project)的AssemblyInfo.cs文件。此文件具有一个程序集属性列表,默认情况下,在VisualStudio.NET中创建项目时将包括这些属性。在代码中修改名为“AssemblyKeyFile”的属性,如下所示:
[assembly:AssemblyKeyFile("C:\MySloutionKey.snk")]
这样,编译该项目即生成强命名的程序集。
至于把强命名的程序集部署到全局程序缓存的方法则有两种:
使用Windows资源管理器将程序集拖到缓存中。
使用.NETFrameworkSDK所提供的名为全局程序集缓存工具(Gacutil.exe)的开发人员工具。其命令行语法为
在.Net中,微软引入了一种新的解决方案:强命名程序集(StrongName),以及与之配套的全局程序集缓存(GAC)来解决这个问题。
我们知道,.Net使用Name、Version、Culture、PublicToken四个属性来唯一标识一个程序集,而不同产品前三个属性(Name、Version和Culture)完全相同的情况是有可能发生的,如此一来,这唯一标识程序集可重任就落到PublicToken的头上了。强命名的程序集正是使用RSA来保证PublicToken的唯一性,因为在理论上,非对称算法RSA生成的公钥/私钥对不会重复。.Net正是通过在编译项目时将指定的公钥/私钥对写入程序集来保证其唯一性。
对于全局程序集缓存(GAC),MSDN是这样介绍的:安装有公共语言运行库的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存。全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集。
在开发一般的、非共享的程序时,我们不需要使用强命名的程序集,仅将项目(Project)编辑成.DLL或者.EXE即可。但是,如果我们开发的是组件库、框架时,通过对程序集进行强命名,并使用将其部署到GAC中,可以保证我们的程序集不会出现版本问题。
那么,如何创建强命名的程序集呢?以下是其步骤
使用SN工具来生成密钥对。该工具位于安装.NETFrameworkSDK的Bin目录中,在命令行中使用“SN-k[驱动器号]:[放置密钥的目录][密钥名称].snk”这样的语句可以生成密钥对。如,我们使用SN-kC:\MySloutionKey.snk,可以把名为MySloutionKey.snk的密钥对文件生成到C盘根目录下;
此时,该密钥对并未与项目的程序集建立关联,我们需要打开项目(Project)的AssemblyInfo.cs文件。此文件具有一个程序集属性列表,默认情况下,在VisualStudio.NET中创建项目时将包括这些属性。在代码中修改名为“AssemblyKeyFile”的属性,如下所示:
[assembly:AssemblyKeyFile("C:\MySloutionKey.snk")]
这样,编译该项目即生成强命名的程序集。
至于把强命名的程序集部署到全局程序缓存的方法则有两种:
使用Windows资源管理器将程序集拖到缓存中。
使用.NETFrameworkSDK所提供的名为全局程序集缓存工具(Gacutil.exe)的开发人员工具。其命令行语法为
Gacutil[options][assemblyName|assemblyPath|assemblyListFile]
详细信息请参考MSDN的相关说明(地址为ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/dv_fxtools/html/4c7be9c8-72ae-481f-a01c-1a4716806e99.htm)。
相关文章推荐
- 强命名程序集和部署到GAC
- [ZT]如何部署强命名程序集(Strong Name Assembly)和GAC
- 3.7 私有部署强命名程序集
- CLR via C# 3 读书笔记(17):第3章 共享程序集和强命名程序集 — 3.1 两种程序集,两种部署方式 & 3.2 对程序集进行强命名
- 如何部署强命名程序集(Strong Name Assembly)和GAC
- CCNP路由-22 BGP community属性及其部署详解
- 关于反射中Assembly.Load("程序集").CreateInstance("命名空间.类")与Activator.CreateInstance()方法
- 命名空间“Microsoft”中不存在类型或命名空间名称“Office”(是缺少程序集引用吗?)
- 命名空间“System.Data”中不存在类型或命名空间名称“SQLite”。是否缺少程序集引用。解决办法如下:
- CS0234: 命名空间“System”中不存在类型或命名空间名称“Linq”(是否缺少程序集引用?)
- 分布式文件系统及其部署
- 创建强命名程序集
- 使用VS2010命令提示窗口操作程序集强命名
- 命名空间与程序集
- 标识符及其命名规范
- 部署LAMP架构及其应用
- 部署LNMP架构及其应用
- ASP.NET#命名空间"System.Data"中不存在类型或命名空间名称"Linq"(是否缺少程序集引用?)
- .NET程序生成打包部署及其简单配置管理
- 命名空间与程序集