什么是publickeytoken及publickeytoken的作用
2008年08月13日 星期三 09:52
namespace是干嘛的摘 要 概 念 正 文 附 注 总 结 摘要: 随着社会的发展,人们对于科技应用到各个领域有新的认识,同时,这就使我们技术人员对于开发平台也有更高的要求。大家都知道,或者都听过,.NET有很强悍的版本控制,可以让我们很轻松的进行程序集的版本控制,实现程序的灵活配置和简单升级,告别Dll地狱,本文将用一个具体的实例说明如何使用这个功能。 概念: (一)DotNet中的版本组成 DotNet中的版本由4个物理号码组成,如图(一) 图(一) 在程序集里面,我们可以通过加上AssemblyVersion特性来设置它, 如[assembly: AssemblyVersion("2.0.2.11")] (二) GAC: 计算机范围内的代码缓存,它存储专门安装的程序集,这些程序集由计算机上的许多应用程序共享。在全局程序集缓存中部署的应用程序必须具有强名称,一个程序集如果注册到了GAC里,被其他程序集合引用的时候,将不会拷贝副本到引用的程序目录中。 (本文只讨论注册到GAC中的程序集) 正文: (1) 我们现在开始写第一个组件 它的版本号为 1.0.0.0 有一个类,包含一个简单的方法,该方法返回一个字符串 代码如下,我都做了注解 //首先生成强名称到文件中 sn –k c:\Version.snk //写类文件 v1.cs using System; using System.Reflection; [assembly: AssemblyKeyFile(@"c:\Version.snk")] //因为注册到GAC,所以使用强名称签名 [assembly: AssemblyVersion("1.0.0.0")] //设置版本号 namespace V1 { public class V1 { public V1() { } public string GetVersion() { return "你好,我是版本1"; } } } 编译成组件 V1.dll 拷贝这个V1.dll到 文件夹c:\V1 把V1.dll注册到GAC Gacutil –I c:\V1\V1.dll 系统显示注册成功 (2) 然后我们编写一个控制台程序测试这个组件 TestVersion.cs /// ///请添加对V1.dll(c:\V1\V1.dll)的引用,因为是在Gac里面,所以V1.dll不会在本地目录存在 /// using System; namespace TestVersion { class TestVersion { static void Main(string[] args) { V1.V1 v1=new V1.V1(); Console.WriteLine(v1.GetVersion()); Console.Read(); } } } 编译后运行() 屏幕输出的结果是 : "你好,我是版本1" (3) 好了,一切很美好,过了几年了,我们得升级程序了 现在来编写V1.dll升级版本,版本号为2.0.0.0 v1.cs using System; using System.Reflection; [assembly: AssemblyKeyFile(@"c:\Version.snk")] ///使用上面的强名称 [assembly: AssemblyVersion("2.0.0.0")] ///注意,这里已经改了主版本号 namespace V1 { public class V1 { public V1() { } public string GetVersion() { return "你好,我是版本2";///修改了输出的结果,这样我们才知道到底是运行了那个 } } } 编译 成组件 V1.dll 拷贝这个V1.dll到 文件夹c:\V2 把V1.dll注册到GAC Gacutil –I c:\V2\V1.dll (4) .现在来看看再次运行输出了什么东西 是的,和原来的没有变化还是 "你好,我是版本1" 为什么不是"你好,我是版本2"? 我们用打开程序集 看看 是的,它目前就是使用了版本1.0.0.0 (5) 我们开始进行版本升级 把使用的版本由1.0.0.0替换成版本2.0.0.0 其实很简单的,给我们的 加个配置文件 fig里面打入 <?xml version="1.0"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="V1" publicKeyToken=" 758fe4e9db9d8251"/> <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> 简单说明: assemblyIdentity 主要进行程序集合的标识 其中 name是程序集的名称 publicKeyToken是公匙的标记;如何获得这些信息呢?很简单,打开%SystemDir%\assembly (我的是C:\WINNT\assembly) 可以看到这些信息(如下图,你的机器上可能和我不一样) 可以看到有两个V1(正确,我们确实注册了两个进去,版本也对) 我们开始用的是1.0.0.0的,记下公匙Token 写到publicKeyToken bindingRedirect 节点主要配置版本如何跳转 oldVersion="1.0.0.0" newVersion="2.0.0.0" 很清楚的,就是如果使用的V1.dll是旧版本的,程序集版本号为1.0.0.0,那么就使用新的,版本号为2.0.0.0的程序集 需要注意的是,oldVersion 可以使用范围来界定,如 oldVersion="1.0-1.9" 但是如果没有使用范围表示法的话,一定要写全版本号 newVersion 不可以使用范围表示法,请写全版本号 好了,现在再次运行 输出的是: "你好,我是版本2",掌声!!! 就是怎么简单! (6) 如果现在我们用打开程序集,看到的内容将没有变化 确实,是配置文件起了作用,整个过程没有对调用程序的代码做半点改动! (7) 配置错了会怎么样?: 有可能的错误,比如newVersion写错了,根本没这个升级版本,将会抛出异常System.IO.FileNotFoundException,请注意处理 附注: 其实我们可以用控制面板中的Microsoft .NET Framework Configuration来配置版本管理,使用起来更简单,篇幅关系,需要可以联系我索取使用方法(bcatcat@hotmail) 总结: 可以看到,.NET为我们提供的版本控制是强大的而简单的,通过简单的配置就可以达到目的,希望本文能起到抛砖引玉的作用 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论