CLR筆記 3 共享程式集合強命名程式集

2021-05-10 14:07:31 字數 2690 閱讀 8701

3.1 兩種程式集,兩種部署

clr有兩種程式集,弱命名程式集和強命名程式集,二者基本一樣,區別:強命名程式集時用發布者的公鑰/私鑰對 進行了簽名,唯一性的標識了程式集的發布者。弱命名程式集只能私有部署,強命名程式集可以使用全域性部署,也可以私有部署。

3.2 為程式集指派強名稱

乙個強命名的程式集包括4部分重要屬性,標誌唯一:乙個無副檔名的程式集,乙個版本號,乙個語言文化標誌,乙個公鑰publickey。此外,還使用發布者的私鑰進行簽名

mytypes,version=1.0.8123.0,culture=neatral,publickeytoken=***************x(公鑰標記)

ms使用公鑰/私鑰加密技術,這樣,沒有兩家公司有相同的公鑰/私鑰對(除非他們共享公鑰/私鑰對)。

使用反射獲取強命名程式集的publickeytoken

建立強命名程式集的步驟:

1.生成公鑰/私鑰對:使用sn命令,這個命令所有開關都區分大小寫

sn -k mycompany.keys

——這裡mycompany.keys是建立的檔名

2.將原有程式集公升級為強命名程式集

用私鑰簽名乙個檔案:是指生成乙個強命名程式集時,程式集的filedef清單中列出了包含的所有本件,將每個檔名稱新增到清單中,檔案的內容都會根據私鑰進行雜湊處理,得到的雜湊值與檔名一起存入filedef中。這個雜湊值稱為rsa數字簽名。

最終,生成的包含清單的pe32檔案,其中會含有rsa數字簽名和公鑰

補充1:簽名預設使用sha-1演算法,也可以使用別的演算法,通過al命令的/algid開關指定。

補充2,還可以使用sn命令,在原有基礎上,得到只含公鑰的檔案並顯示:

sn -p mycompany.keys mycompany.publickey

——這裡mycompany.publickey是建立的公鑰檔名

sn -pt mycompany.publickey

——顯示公鑰與公鑰標記

補充3:在il中,local對應於culture

補充4:公鑰標記是公鑰的最後8個位元組。

assemblyref中存的是公鑰標記,assemblydef存的是公鑰。

3.3 gac 全域性程式集快取

gac一般在c:windowsassembly,結構化的,有很多子目錄。

使用windows explorer shell擴充套件來瀏覽gac目錄,這個工具是在安裝framework時附帶的。

不能使用手動方法複製程式集檔案到gac,要使用gacutil命令。

只能安裝強命名程式集到gac中,而且要有admin/poweruser許可權。

gac的好處是可以容納乙個程式集的多個版本。每個版本都有自己的目錄。缺點是違反了簡單安裝的原則。

3.4 在生成的程式集中引用乙個強命名程式集

第2章有講到,對於不完整路徑,csc編譯時目錄查詢順序:

1.工作目錄(要編譯的cs檔案所在)

2.系統目錄(csc.exe所在,同時也包括clr dll)

3./lib開關指定的目錄

4.lib系統變數指定的目錄

安裝framework時,會安裝.net程式集兩套副本,一套在編譯器/clr目錄——便於生成程式集,另一套在gac子目錄——便於在執行時載入它們。編譯時並不去gac中查詢。

3.5 強命名程式集能防範篡改

在安裝強命名程式集到gac時,系統對包含清單的檔案內容進行雜湊處理,並將這個值與pe32檔案中嵌入的rsa數字簽名進行比較,如果一致,就再去比較其他檔案內容(也是雜湊處理在比rsa簽名)。一旦有乙個不一致,就不能安裝到gac。

如果強命名程式集安裝在gac以外的目錄,則會在載入時比較簽名。

3.6 延遲簽名(部分簽名) delayed signing

開發階段會使用到這個功能

允許開發人員只用公鑰來生成乙個程式集,而不需要私鑰。

編譯時,會預留一定空間來儲存rsa數字簽名,不對檔案內容進行雜湊處理。clr會跳過對雜湊值的檢查。以後可以再對其進行簽名。

步驟如下:

1.生成程式集:csc /keyfile: mycompany.publickey /delaysign: myassembly.cs

2.跳過對雜湊值的檢查: sn.exe -vr myassembly.dll

3.準備私鑰,再次進行簽名: sn.exe -r myassembly.dll mycompany.privatekey

4.再次延遲簽名: sn.exe -vu myassembly.dll

3.7 私有部署強命名程式集

強命名程式集如果不在gac中,每次載入都要進行驗證,有效能損失。

還可以設計為區域性共享強命名程式集,指定配置檔案的codebase即可。

3.8 執行庫如何解析型別引用

在typeref中查詢型別引用的紀錄,發現其強簽名,然後定位這個程式集的所在位置:會在以下三個地方查詢:

1.同乙個檔案:編譯時就能發現(早期繫結)

2.不同的檔案,但同乙個程式集:在fileref表中

3.不同的檔案,不同的程式集:這時要載入被引用的程式集,從中查詢

注:assemblyref使用不帶副檔名的檔名來引用程式集。繫結程式集時,系統通過探測xx.dll和xx.exe來定位檔案。

moduledef,moduleref,filedef使用檔名及其副檔名來引用檔案。

注:在gac中查詢程式集時,除了名稱,版本,語言文化和公鑰,還需要cpu體系結構,而且是先根據這個體系結構查詢。

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

2017年08月12日 23 36 52 生活常識 閱讀數 187 clr支援兩種型別的程式集 弱命名程式集 weakly named assembly 和強命名程式集 strongly named assembly 二者的區別 強命名程式集使用發布者的公鑰 私鑰進行了簽名。這一堆金鑰允許對程式集進...

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...