什么是publickeytoken及publickeytoken的作用

作者: 黄志彬(在dev-club上俺叫笨猫猫)

本人在看一些例子的时候,总是能看到配置文件中有一些publickeytoken的字样,本人不太明白,所以在网上搜了一下,
看到msdn里边有人做了解释,恍然大悟,为了感谢作者,本人在这里转载一下.
原文地址:
http://www.microsoft.com/china/community/program/originalarticles/techdoc/DOTNETVersion.mspx

概念:
(一)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:V1V1.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();
        }
    }
}

编译后运行(TestVersion.exe)
屏幕输出的结果是 :
"你好,我是版本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) .现在来看看再次运行TestVersion.exe输出了什么东西
是的,和原来的没有变化还是
"你好,我是版本1"
为什么不是"你好,我是版本2"?
我们用ildasm.exe打开程序集TestVersion.exe 看看

是的,它目前就是使用了版本1.0.0.0
(5) 我们开始进行版本升级
把TestVersion.exe使用的版本由1.0.0.0替换成版本2.0.0.0
其实很简单的,给我们的 TestVersion.exe
加个配置文件 TestVersion.exe.config里面打入

<? 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" 很清楚的,就是如果TestVersion.exe使用的V1.dll是旧版本的,程序集版本号为1.0.0.0,那么就使用新的,版本号为2.0.0.0的程序集
需要注意的是,oldVersion 可以使用范围来界定,如 oldVersion="1.0-1.9" 但是如果没有使用范围表示法的话,一定要写全版本号
newVersion 不可以使用范围表示法,请写全版本号
好了,现在再次运行TestVersion.exe
输出的是: "你好,我是版本2",掌声!!!
就是怎么简单!
(6) 如果现在我们用ildasm.exe打开程序集TestVersion.exe,看到的内容将没有变化
确实,是配置文件起了作用,整个过程没有对调用程序TestVersion.exe的代码做半点改动!
(7) 配置错了会怎么样?:
有可能的错误,比如newVersion写错了,根本没这个升级版本,将会抛出异常System.IO.FileNotFoundException,请注意处理

--------------------------------------------------------------------------------

附注:
其实我们可以用控制面板中的Microsoft .NET Framework Configuration来配置版本管理,使用起来更简单,篇幅关系,需要可以联系我索取使用方法(bcatcat@hotmail.com)

--------------------------------------------------------------------------------

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: spire.license, version=1.4.0.40, culture=neutral, publickeytoken=b1144360237 是一个软件许可证的名称和相关信息。 首先,“spire.license” 是指软件中使用的许可证文件的名称。这个许可证文件可能包含了用户使用该软件的条款和条件,如许可证类型、使用期限、许可范围等。 而"version=1.4.0.40"表示该许可证文件的版本号为1.4.0.40,这是用来标识该许可证文件的特定版本。版本号可以用来追踪和管理软件的发展和更新进程。 接下来是"culture=neutral",表示这个许可证文件与特定文化或语言无关。这意味着无论用户使用的是什么语言或文化背景,都可以使用该许可证文件。 最后是"publickeytoken=b1144360237",这是一个公钥标记,用于唯一识别这个许可证文件。公钥标记是根据许可证文件的公钥生成的,用来验证文件的真实性和完整性。 综上所述,spire.license, version=1.4.0.40, culture=neutral, publickeytoken=b1144360237 是一个软件许可证文件的名称和相关信息,用于确保用户在符合规定的条件下合法使用该软件。 ### 回答2: spire.license, version=1.4.0.40, culture=neutral, publickeytoken=b1144360237 是一个用于许可证管理的程序集。 这个程序集的版本号是1.4.0.40,它包含了许可证管理的相关功能和代码。它的文化(culture)是中立的,意味着它没有特定的语言或地区限制。publickeytoken=b1144360237是指该程序集使用的公钥令牌,用于确保程序集的完整性和安全性。 这个程序集可能是由Spire公司或团队开发的,用于在软件或应用程序中管理许可证。许可证管理是一种重要的功能,它可以确保软件在使用过程中的合法性和合规性。 用户可以根据需要使用spire.license, version=1.4.0.40, culture=neutral, publickeytoken=b1144360237来实现许可证管理。通过使用这个程序集,开发人员可以轻松地创建、验证和更新许可证,以控制软件的访问权限和有效期限。 总之,spire.license, version=1.4.0.40, culture=neutral, publickeytoken=b1144360237 是一个用于许可证管理的程序集,它提供了许可证相关的功能和代码,可以帮助开发人员实现软件许可证管理的需求。 ### 回答3: spire.license是一个软件库,用于对Spire组件进行许可证管理的工具。version=1.4.0.40表示当前使用的是Spire许可证管理工具的1.4.0.40版本。culture=neutral表示该工具不依赖于特定的语言或文化。publickeytoken=b1144360237表示该软件库的公钥令牌是b1144360237。 通过使用spire.license工具,用户可以管理和控制Spire组件的许可证,以确保其合法性和合规性。许可证管理工具的不同版本可能具有不同的功能和特性,用户根据自己的需求选择合适的版本进行使用。 许可证管理工具的文化为“neutral”,意味着该工具适用于任何文化或语言环境。这使得用户可以在不考虑特定地区或语言要求的情况下使用该工具。 公钥令牌是作为软件库的身份验证标识的一种方式。publickeytoken=b1144360237表示此软件库的公钥令牌为b1144360237。公钥令牌可用于验证软件库的完整性,防止恶意软件的篡改或未经授权的访问。 综上所述,spire.license, version=1.4.0.40, culture=neutral, publickeytoken=b1144360237是用于管理Spire组件许可证的工具的版本、文化和公钥令牌的标识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值