1. 程式人生 > >C#中.snk檔案的作用【轉】

C#中.snk檔案的作用【轉】

 SNK,作為程式字尾的時候,是.net中的強密匙加密檔案!

當你把一個程式集放進GAC(全域性程式集快取)時,就要加強名(也就是簽名),在GAC中的程式集可以被所有程式引用訪問(相當於以前COM元件在登錄檔裡註冊一樣),如果不放進GAC,剛所有使用這個程式集都要複製這個程式集(也就是私有程式集),所以用不用強名要看情況而定.

如果不是 要把.dll共享 可以不使用強名
強名稱是為了你的Dll檔案的安全,一般我們的dll檔案,隨便在哪隻要引用就可以用
但如果用了強名稱的話,dll 就會有一個祕鑰,其它人就不能引用了

如何建立帶有強名稱的程式集
可以向程式集分配稱為強名稱的加密簽名,它為程式集提供名稱的唯一性並防止他人借用您的程式集名稱(名稱欺騙)。如果您正在部署一個將被同一臺計算機上的多個應用程式共享的程式集,則該程式集必須有強名稱。即使只在您的應用程式中使用該程式集,使用強名稱也可確保載入該程式集的正確版本。

生成具有強名稱的程式集的第一步是獲得加密金鑰對。.NET Framework SDK 包括一個可用來生成金鑰對的“強名稱”工具 (Sn.exe)。由“強名稱”工具生成的金鑰對可以保留在檔案中,您也可以將它儲存在本地計算機的“加密服務提供程式”(CSP) 中。下面的命令使用“強名稱”工具生成一個新的金鑰對並將它儲存在名為 TestKey.snk 的檔案中:

sn -k Testkey.snk

在獲得金鑰對後,需要向原始檔中新增正確的自定義屬性,以便編譯器發出帶有強名稱的程式集。根據用於簽名的金鑰對是包含在檔案中還是 CSP 內的金鑰容器中,正確地選擇屬性。對於儲存在檔案中的金鑰,請使用 System.Reflection.AssemblyKeyFileAttribute。對於儲存在 CSP 中的金鑰,請使用 System.Reflection.AssemblyKeyNameAttribute。

(*) 如果未指定金鑰,則程式集不會被簽名。
// (*) KeyName 是指已經安裝在
// 計算機上的加密服務提供程式(CSP)中的金鑰。KeyFile 是指包含
// 金鑰的檔案。
// (*) 如果 KeyFile 和 KeyName 值都已指定,則
// 發生下面的處理:
// (1) 如果在 CSP 中可以找到 KeyName,則使用該金鑰。
// (2) 如果 KeyName 不存在而 KeyFile 存在,則
// KeyFile 中的金鑰安裝到 CSP 中並且使用該金鑰。
// (*) 要建立 KeyFile,可以使用 sn.exe(強名稱)實用工具。
// 在指定 KeyFile 時,KeyFile 的位置應該
// 相對於“專案輸出目錄”。專案輸出
// 目錄的位置取決於您是在使用本地專案還是 Web 專案。
// 對於本地專案,專案輸出目錄定義為
// <Project Directory>\obj\<Configuration>。例如,如果 KeyFile 位於該
// 專案目錄中,應將 AssemblyKeyFile
// 屬性指定為 [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
// 對於 Web 專案,專案輸出目錄定義為
// %HOMEPATH%\VSWebCache\<Machine Name>\<Project Directory>\obj\<Configuration>。 --------------------- 本文來自 Tragedy 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/gyc1105/article/details/6623618?utm_source=copy