標籤: 暫無標籤

強名稱 (strong name) 由一個程序集的標識組成並通過公鑰和數字簽名(針對該程序集生成)加強的名稱,其中的標識包括程序集的簡單文本名稱、版本號和區域性信息(如果提供的話)。

1簡介

由於程序集清單包含構成程序集實現的所有文件的文件散列,因此只對程序集中包含程序集清單的一個文件生成數字簽名就足夠了。強名稱相同的程序集應該是相同的。
一個程序集通常包括4個自定義屬性,用來惟一識別程序集,它們是文件名(無擴展名)、版本號、區域性標識和公鑰標記,比如:
"Hello, version=1.0.0.0, culture=neutral, publicKeyToken=9ebd24cc40ff21fd"
其中publicKeyToken是公鑰的64位散列值,可以唯一標識程序集,擁有公鑰標記的程序集稱為強名稱程序集,強名稱程序集可以防篡改;可以安裝到GAC中,為多個程序集所共享;還可以實施版本策略(不同版本的強名稱程序集被認為是不同的程序集)。而公鑰標記為空的程序集只能存在於所引用的程序集的目錄以及子目錄中,也無法實施版本策略(引用它的程序集會忽略版本號)。
通過簽發具有強名稱的程序集,您可以確保名稱的全局唯一性。

2強名稱還特別滿足以下要求

*
強名稱依賴於唯一的密鑰對來確保名稱的唯一性。任何人都不會生成與您生成的相同的程序集名稱,因為用一個私鑰生成的程序集的名稱與用其他私鑰生成的程序集的名稱不相同。
*
強名稱保護程序集的版本沿襲。強名稱可以確保沒有人能夠生成您的程序集的後續版本。用戶可以確信,他們所載入的程序集的版本出自創建該版本(應用程序是用該版本生成的)的同一個發行者。
*
強名稱提供可靠的完整性檢查。通過 .NET Framework 安全檢查后,即可確信程序集的內容在生成后未被更改過。但請注意,強名稱中或強名稱本身並不暗含信任級別,例如由數字簽名和支持證書提供的信任。
在引用具有強名稱的程序集時,您應該能夠從中受益,例如版本控制和命名保護。如果此具有強名稱的程序集以後引用了具有簡單名稱的程序集(後者沒有這些好處),則您將失去使用具有強名稱的程序集所帶來的好處,並依舊會產生 DLL 衝突。因此,具有強名稱的程序集只能引用其他具有強名稱的程序集。

3公鑰生成方法

公鑰可以通過.NET SDK提供的SN.exe命令生成,生成方法是:
SN.exe -k Zhang.snk
這樣就得到一個名為Zhang.snk的公/私密鑰對文件,將其放至某一目錄下,比如G:\,然後就可以創建強名稱程序集了,只需要在源代碼中添加下面的自定義屬性即可:
[assembly:AssemblyKeyFile(@"G:\Zhang.snk")]

4示例

下面是一個Hello.cs文件,是創建強名稱程序集的示例
using System;using System.Reflection;[assembly:AssemblyVersion("1.0.0.0")]
//程序集版本[assembly:AssemblyCultureAttribute("")]
// 區域(為空,表示語言中立)[assembly:AssemblyKeyFile(@"G:\zhang.snk")]
// 公私密鑰對
namespace Liu.Study {
public class Hello {
public Hello() {
Console.WriteLine("Class Hello Version 1.0");
}
public void SayHello() {
Console.WriteLine("Hello, C#!");
}
}
}
#Hello.rsp
/out:.\bin\Hello.dll
/target:library
Hello.cs
#end
最後編譯源代碼:csc.exe Hello.rsp,就得到了一個強名稱程序集Hello.dll,使用Reflector.exe打開這個程序集,可以看到這樣的描述:name: Hello, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9ebd24cc40ff21fd。

相關評論

同義詞:暫無同義詞