什么是publickeytoken及publickeytoken的作用

article/2025/10/25 3:59:04

作者: 黄志彬(在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)

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


http://chatgpt.dhexx.cn/article/Ybte0NEL.shtml

相关文章

java drm_Linux DRM那些事-RockPI DRM

一、DRM基本组件 Linux内核DRM框架包括&#xff1a;GEM和KMS。引用网络图片&#xff0c;展示DRM大体框架&#xff1a; 1、GEM GEM(Graphic Execution Manager):图形执行管理器&#xff0c;主要是对 FrameBuffer 的管理&#xff0c;如内存的申请、释放、共享和同步(GPU和CPU之间…

Linux DRM(二) --Xorg/DRM

了解xorg 1.前言 GUI作为人机交互的一种方式&#xff0c;通过其承载的大量信息提高了信息交流的效率。这里我们不介绍鼠标、键盘等输入设备&#xff0c;只介绍输出显示这一子模块。生活中大家最常见的图形化界面估计就是图像化界面的桌面环境&#xff0c;即窗口系统。 窗口系统…

Linux DRM 理解

本文从如下几个部分介绍 1. DRM 概念介绍2. 对比HW结构分析3. code分析 1. DRM 概念介绍 DRM 是Direct Render Manager的缩写&#xff1a; Linux 显示子系统结构框架 向上提供标准API给到应用使用管理GPU和Display模块 相较于原来的framebuffer结构&#xff0c;DRM将更多的硬…

直接渲染管理器(Direct Rendering Manager, DRM)

这是一篇来至于wiki的译文&#xff0c;希望对学习DRM的同学有帮助。 目录 概述 软件架构 API DRM-Master and DRM-Auth 图形执行管理器&#xff08;Graphics Execution Manager&#xff09; Translation Table Maps DMA Buffer共享和PRIME KMS&#xff08;Kernel Mode…

java drm_DRM系统工作原理

一、系统工作原理DRM技术是一项加强对音频、视频数字化产品内容版权保护的技术,其基本的工作原理是将音频、视频等文件进行加密编码处理,再建立一个证书授权服务中心;当用户使用这些加密文件时,应用软件会根据其包含在头文件中的有关属性自动链接到相应的站点(证书授权服务…

drm oracle,近距离接触RAC DRM

drm 是Oracle rac中独有的动态资源管理操作&#xff0c; 我们听了很多关于DRM的理论&#xff0c; 但是你是否亲眼见证过DRM, 今天我们就来看一下&#xff1a; SQL> select * from v$version; BANNER ---------------------------------------------------------------------…

菜鸟修炼笔记-音视频开发基础知识-drm简介

音视频开发基础知识-drm简介 前言一。DRM的基础概念1. DRM是什么&#xff1f;2. DRM的组成2.1 libdrm2.2 GEM2.3 KMS 二。KMS各个元素详解1. plane1.1 定义&#xff1a;1.2 类型1.3 功能1.4 使用&#xff1a;1.5 注意&#xff1a; 2. property2.1 定义和作用&#xff1a;2.2 常…

CSS字体的font-family属性和@font-face使用方法

CSS字体的font-family属性&#xff1a; font-family属性一共有5个字体系列&#xff0c;分别是&#xff1a; sans-serif&#xff1a; 包括没有衬线的字体&#xff0c;与serif相比&#xff0c;通常认为sans-serif在计算机屏幕上更容易识别。 serif&#xff1a; 包括有衬线的字…

前端漂亮的字体 font-family

今天在看UI图的时候看到这种字体&#xff0c;给大家分享分享&#xff0c;直接上图 图一 利用字体系列font-family div{font-size: .7rem;color: #ffeb7b;/* 黄色 */font-family: electronicFont; /* 这是重点&#xff01;&#xff01;&#xff01; */ }图二 利用文字阴影text-…

【CSS】font-family的相关字体设置

大家都知道&#xff0c;在不同操作系统、不同游览器里面默认显示的字体是不一样的&#xff0c;并且相同字体在不同操作系统里面渲染的效果也不尽相同&#xff0c;那么如何设置字体显示效果会比较好呢&#xff1f;下面我们逐步的分析一下&#xff1a; 一、字体基础知识 css 中…

Web 字体 font-family 浅谈

前言 最近研究各大网站的font-family字体设置&#xff0c;发现每个网站的默认值都不相同&#xff0c;甚至一些大网站也犯了很明显的错误&#xff0c;说明字体还是有很大学问的&#xff0c;值的我们好好研究。 不同的操作系统、不同浏览器下内嵌的默认字体是不同的&#xff0c;错…

font-faimly字体大全

清 font-size:100px 为例 font-family:“Arial”,“Microsoft YaHei”,“黑体”,“宋体”,sans-serif; font-family:Tahoma,Helvetica,Arial,‘宋体’,sans-serif; font-family: ‘Microsoft YaHei’,arial,tahoma,\5b8b\4f53,sans-serif; font-family:Tahoma,Helvetica,A…

html字体设置font-family

<div ><p style"font-family:STHeiti">1.华文黑体:STHeiti</p><p style"font-family:STKaiti">2.华文楷体&#xff1a;STKaiti</p><p style"font-family:STSong">3.华文宋体&#xff1a;STSong</p>&l…

html常用font-family设置字体样式

<table border"1" cellpadding"0" cellspacing"0" ><tr><td><h3 style"font-family: 黑体;">黑体&#xff1a;SimHei</h3></td><td><h3 style"font-family: 华文黑体;">华…

font-family、font-style、font-weight、font-variant的区别「In CSS」

学习 CSS&#xff0c;看文档的时候总是对 font 的属性搞不清楚或者总是搞混。 这里总结一下这四个经常搞混的&#xff08;特别是前面两个&#xff09;。 font-family 这个属性指的是字体&#xff0c;比如说汉字中常说的行书与草书。 这个属性的值可以有多个&#xff0c;因为…

FontFamily 看这里就够了

TextView中字体设置 typeface 一、配置设置 代码方式设置 fontFamily 文字如何实现加粗、斜体&#xff1f; 三者之间的关系 自定义字体 参考&#xff1a; TextView中字体设置 textView中有三个属性可以设置字体 textStyle&#xff1a;设置样式fontFamily&#xff1…

WPF—WrapPanel布局

WrapPanel布局面板将各个控件从左至右按照行或列的顺序罗列&#xff0c;当长度或高度不够是就会自动调整进行换行&#xff0c;后续排序按照从上至下或从右至左的顺序进行。 Orientation——根据内容自动换行。当 Horizontal选项看上去类似于Windows资源管理器的缩略图视图&…

WrapPanel

WrapPanel将子元素自左向右逐个地排列, 若一个水平行中放不下,就排在下一行。面板的方向可以是水平或垂直的 <Window x:Class"Panel布局.WrapPanelxaml"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.…

WPF中5种内建面板Canvas、StackPanel、WrapPanel、DockPanel、Grid分析

https://blog.csdn.net/weixin_43437202/article/details/88292620 Canvas、StackPanel、WrapPanel、DockPanel和Grid是WPF中主要的5种内建面板&#xff0c;这些面板类都位于System.Windows.Controls命名空间下。 主要布局特点简述 Grid 按行列排列内容&#xff0c;如果没有特…

WPF 改进 WrapPanel 右侧填充

WPF 改进 WrapPanel 右侧填充 本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。 WPF 改进 WrapPanel 右边缘填充 作者&#xff1a;陈-林-赵-魏|驚鏵 原文链接[1]&#xff1a;https://www.cnblogs.com/wandia/p/17084881.html 目的&#xff1a;改进下WrapPanel,…