強名稱組件四大核心屬性:無副檔名組件名、版本號、文化特性標識、公開金鑰。另以私密金鑰簽名。
MyTypes, Version=1.0.8123.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx
PublicKeyToken。建立步驟:
sn -k MyCompany.keys 產生金鑰對。csc /keyfile:MyCompany.keys app.cs 升級為強名稱組件(app.cs 必須包含資訊清單)。編譯器用私密金鑰簽名,在資訊清單內嵌公開金鑰。FileDef 清單列出所有檔案,各檔案內容經私密金鑰雜湊得 RSA 數位簽名,與檔名存入 FileDef。最終 PE32 檔含 RSA 簽名與公開金鑰。補充:預設 SHA-1,可用 al /algid 指定演算法。sn -p 擷取公開金鑰檔;sn -pt 顯示公開金鑰與 Token。PublicKeyToken 為公開金鑰最後 8 位元組。AssemblyRef 存 Token,AssemblyDef 存完整公開金鑰。
C:\Windows\Assembly,結構化子目錄。GACUtil。編譯器目錄搜尋順序:工作目錄 → 系統目錄(csc.exe 所在,含 CLR DLL) → /lib 指定目錄 → LIB 環境變數目錄。Framework 安裝兩套副本:編譯器/CLR 目錄(編譯用)與 GAC 子目錄(執行期載入用),編譯時不搜尋 GAC。
開發階段使用。允許僅用公開金鑰產生組件,無需私密金鑰。編譯時預留 RSA 簽名空間,不雜湊檔案內容,CLR 跳過雜湊檢查,稍後再簽名。
csc /keyfile:MyCompany.PublicKey /delaysign+ MyAssembly.cssn -Vr MyAssembly.dll 跳過雜湊驗證。sn -R MyAssembly.dll MyCompany.PrivateKey 正式簽名。sn -Vu MyAssembly.dll 取消跳過驗證。不在 GAC 時每次載入皆驗證,有效能損失。可設計為本地共享強名稱組件(設定 codeBase)。
在 TypeRef 查找記錄,發現強名稱,定位組件位置,三處搜尋:同一檔案(編譯期早期繫結)、不同檔案同組件(FileRef 表)、不同檔案不同組件(載入被引用組件查找)。AssemblyRef 用無副檔名檔名引用;繫結時探測 xx.dll/xx.exe。ModuleDef/Ref, FileDef 用含副檔名檔名。GAC 查找除名稱/版本/文化/公開金鑰外,尚需 CPU 架構,且優先依架構查找。