CLR 共享程式集和強命名程式集

2021-09-26 10:40:12 字數 3493 閱讀 8182

2023年08月12日 23:36:52 生活常識 閱讀數 187

clr支援兩種型別的程式集:弱命名程式集(weakly named assembly)和強命名程式集(strongly named assembly)。二者的區別:強命名程式集使用發布者的公鑰/私鑰進行了簽名。這一堆金鑰允許對程式集進行唯一性的標識、保護和版本控制。

程式集可採用兩種方式部署:私有或全域性。私有部署的程式集是指部署到應用程式基目錄或子目錄的程式集,弱命名程式集只能以私有方式部署。全域性部署的程式集是指部署到一些公認位置的程式集(gac),clr在查詢程式集時,會檢查這些位置,強命名程式集既可以私有部署,也可以全域性部署。

強命名程式集有4個重要特性:檔名、版本號、語言文化和公鑰(由於公鑰數字很大,所以通常使用從公鑰派生的小雜湊值,稱為公鑰標記)。以下是乙個強命名程式集標識字串及說明:

如何使用visual studio建立金鑰檔案以及強命名程式集這裡就不介紹了,properties|signing|sign the assembly,下面介紹使用強命名工具sn.exe以及c#命令列編譯器csc.exe生成強命名程式集

使用強命名工具sn.exe建立金鑰檔案。

sn.exe位置:

c:\program files (x86)\microsoft sdks\windows\v10.0a\bin\netfx 4.6.1 tools

使用如下命令,建立金鑰檔案:

sn -k answer.snk
命令執行完畢後會在當前目錄生成answer.snk檔案。

注:必須以管理員身份開啟命令列程式cmd.exe,否則無法建立金鑰檔案。

如果要檢視該金鑰檔案的實際公鑰,執行以下兩條命令:

sn -p answer.snk answer.publickey sha256

使用-p命令建立只含公鑰的檔案

sn -tp answer.publickey

使用-tp命令顯示公鑰標記

使用金鑰檔案建立強命名程式集

c:\windows\microsoft.net\framework64\v4.0.30319\csc.exe /t:library /keyfile:answer.snk commontypes.cs
c#編譯器開啟指定金鑰檔案(answer.snk),用私鑰對程式集進行簽名,並將公鑰嵌入清單中。生成強命名程式集時,程式集的filedef清單元資料表列出構成程式集的所有檔案,每將乙個檔名新增到清單,都對檔案內容進行雜湊處理,雜湊值和檔名一同被存入filedef表中。使用ildasm.exe工具檢視程式集元資料,可以看到公鑰已經被嵌入程式集清單中。

建立了強命名程式集之後,我們就可以部署它了。文章的開頭已經介紹,全域性部署的程式集是指部署到一些公認位置的程式集,這個公認位置就是全域性程式集快取(global assembly cache,gac)。gac位置如下:

c:\windows\microsoft.net\assembly
在gac中安裝或解除安裝強命名程式集最常用的工具是gacutil.exe。

gacutil.exe位置:

c:\program files (x86)\microsoft sdks\windows\v10.0a\bin\netfx 4.6.1 tools

gacutil.exe /i d:\test\commontypes.dll
提示註冊成功後,路徑c:\windows\microsoft.net\assembly\gac_msil下生成commontypes資料夾。

任何程式集都包含對其他強命名程式集的引用,因為system.object定義在mscorlib.dll中,mscorlib.dll就是強命名程式集。使用csc.exe的/reference編譯器開關指定想引用的程式集檔案時,若提供完整路徑,csc.exe會載入指定檔案,並根據它的元資料生成程式集;若指定不包含路徑的檔名,csc.exe會在如下目錄查詢程式集:

工作目錄

csc.exe所在目錄,目錄中還包含clr的各種dll檔案

使用/lib編譯器開關指定的任何目錄

使用lib環境變數指定的任何目錄

雖然編譯時會在這裡查詢程式集,但執行時不會在這裡引導程式集。安裝.net framework時,實際會安裝兩套程式集檔案。一套在clr目錄,另一套在gac的子目錄。clr目錄下的檔案便於生成程式集,而gac中的檔案便於執行時載入。

用私鑰對程式集進行簽名,並將公鑰嵌入程式集中,clr就可以驗證程式集是否被修改或破壞。程式集安裝到gac時,系統對包含清單的那個檔案的內容進行雜湊處理,將雜湊值與pe檔案中嵌入的rsa數字簽名進行比較,值完全相同則表明檔案內容未被篡改。此外,系統還會對程式集的其他內容進行雜湊處理,並與清單檔案的filedef表進行比較。

只有少數人才能訪問私鑰,而開發和測試的過程中,需要經常對程式集進行修改,.net framework提供了延遲簽名技術。延遲簽名允許只使用公鑰生成程式集,暫不用私鑰,等到打包和部署程式集時再進行簽名。下面總結了使用延遲簽名技術開發程式集的步驟:

新建delaysignsample.cs檔案

public class delaysignsample

}

使用公鑰檔案編譯程式集

csc /t:library /keyfile:answer.publickey /delaysign delaysignsample.cs

指定-vr命令列開關,使clr暫時信任程式集內容,不進行雜湊建檢驗(這使得程式集能順利安裝到gac,否則註冊時會報錯)

sn.exe -vr delaysignsample.dll

專案開發完成後,使用私鑰進行簽名

sn -r delaysignsample.dll answer.snk

重新啟用對該程式集的驗證

sn -vu delaysignsample.dll

執行應用程式時,clr會載入並初始化自身,讀取程式集的clr頭,查詢標識了應用程式入口方法(main)的methoddeftoken,檢索methoddef源資料表找到il**在檔案中的偏移量,將il**jit編譯成本機**,最後執行本機**。

具體的執行過程在《clr的執行模型》中已經詳細介紹。

下圖展示了clr引導程式集並掃瞄其元資料來定位型別的過程:

標籤: clr via c#

CLR 關於強命名程式集

如何建立強命名程式集 strong name assembly 建立乙個強命名程式集首先需要獲得乙個用強命名實用工具 strong name utility,即sn.exe,net sdk自帶 產生的金鑰。下面簡要介紹一下sn.exe的一些用法。要產生乙個公鑰 私鑰對 a sn k mycompan...

CLR 關於強命名程式集

如何建立強命名程式集 strong name assembly 建立乙個強命名程式集首先需要獲得乙個用強命名實用工具 strong name utility,即sn.exe,net sdk自帶 產生的金鑰。下面簡要介紹一下sn.exe的一些用法。要產生乙個公鑰 私鑰對 a sn k mycompan...

CLR via C 共享程式集和強命名程式集

基礎知識 如下所示 1.要想將型別從乙個程式集移動到另乙個程式集而不造成應用程式中斷,可以使用system.runtime.compilerservices.typeforwardedtoattribute特性在舊的程式集中傳入新程式集中該型別的字串,然後在新的程式集中傳入舊程式集中該型別的字串。建...