publickeytoken

本人在看一些例子的時候,總是能看到配置文件中有一些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來配置版本管理,使用起來更簡單,篇幅關係,需要可以聯繫我索取使用方法([email protected])

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章