首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

CLR 筆記:共用組件與強名稱組件完整指南

     編輯:關於.NET

3.1 兩種組件、兩種部署

  • 弱名稱組件:僅能私有部署。
  • 強名稱組件:以發行者公開/私密金鑰對簽名,唯一標識發行者。可全域部署(GAC),亦可私有部署。

3.2 指派強名稱

強名稱組件四大核心屬性:無副檔名組件名、版本號、文化特性標識、公開金鑰。另以私密金鑰簽名。

MyTypes, Version=1.0.8123.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx
  • MS 使用公開/私密金鑰加密,無兩家公司擁有相同金鑰對(除非共享)。
  • 反射取得 PublicKeyToken。

建立步驟:

  1. sn -k MyCompany.keys 產生金鑰對。
  2. csc /keyfile:MyCompany.keys app.cs 升級為強名稱組件(app.cs 必須包含資訊清單)。編譯器用私密金鑰簽名,在資訊清單內嵌公開金鑰。
  3. 簽名過程:FileDef 清單列出所有檔案,各檔案內容經私密金鑰雜湊得 RSA 數位簽名,與檔名存入 FileDef。最終 PE32 檔含 RSA 簽名與公開金鑰。

補充:預設 SHA-1,可用 al /algid 指定演算法。sn -p 擷取公開金鑰檔;sn -pt 顯示公開金鑰與 Token。PublicKeyToken 為公開金鑰最後 8 位元組。AssemblyRef 存 Token,AssemblyDef 存完整公開金鑰。

3.3 GAC 全域組件快取

  • 路徑 C:\Windows\Assembly,結構化子目錄。
  • 用 Windows Explorer Shell 擴展瀏覽(Framework 安裝時附帶)。
  • 不可手動複製檔案至 GAC,需用 GACUtil。
  • 僅能安裝強名稱組件,需 Admin/PowerUser 權限。
  • 優點:容納同一組件多版本(各版本獨立目錄)。缺點:違反簡單安裝原則。

3.4 參考強名稱組件

編譯器目錄搜尋順序:工作目錄 → 系統目錄(csc.exe 所在,含 CLR DLL) → /lib 指定目錄 → LIB 環境變數目錄。Framework 安裝兩套副本:編譯器/CLR 目錄(編譯用)與 GAC 子目錄(執行期載入用),編譯時不搜尋 GAC。

3.5 強名稱防篡改

  • 安裝至 GAC 時,系統對資訊清單檔案內容雜湊比對嵌入的 RSA 簽名,一致則比對其他檔案;任何不一致拒絕安裝。
  • 安裝在 GAC 外目錄,載入時比對簽名。

3.6 延遲簽名

開發階段使用。允許僅用公開金鑰產生組件,無需私密金鑰。編譯時預留 RSA 簽名空間,不雜湊檔案內容,CLR 跳過雜湊檢查,稍後再簽名。

  1. csc /keyfile:MyCompany.PublicKey /delaysign+ MyAssembly.cs
  2. sn -Vr MyAssembly.dll 跳過雜湊驗證。
  3. sn -R MyAssembly.dll MyCompany.PrivateKey 正式簽名。
  4. sn -Vu MyAssembly.dll 取消跳過驗證。

3.7 私有部署強名稱組件

不在 GAC 時每次載入皆驗證,有效能損失。可設計為本地共享強名稱組件(設定 codeBase)。

3.8 執行階段解析型別引用

在 TypeRef 查找記錄,發現強名稱,定位組件位置,三處搜尋:同一檔案(編譯期早期繫結)、不同檔案同組件(FileRef 表)、不同檔案不同組件(載入被引用組件查找)。AssemblyRef 用無副檔名檔名引用;繫結時探測 xx.dll/xx.exe。ModuleDef/Ref, FileDef 用含副檔名檔名。GAC 查找除名稱/版本/文化/公開金鑰外,尚需 CPU 架構,且優先依架構查找。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved