強式命名是指使用金鑰簽署元件,產生 強名稱元件。 當元件具有強名稱時,它會根據名稱和元件版本號碼建立唯一的身分識別,並可協助防止元件衝突。
強式命名的缺點是,一旦組件被強式命名,Windows 上的 .NET Framework 就會嚴格載入該組件。 強名稱組件參考必須與載入的組件版本完全相符,使開發人員在使用組件時不得不設定繫結重導。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
當 .NET 開發人員抱怨強式命名時,他們真正抱怨的是嚴格的元件載入。 幸運的是,此問題僅限於 .NET Framework。 .NET 5+、.NET Core、UWP 和其他大部分 .NET 實作沒有嚴格的元件載入,這是強式命名的主要缺點。
.NET Framework 上強式命名的其中一個重要特點是它具有傳播性:強式命名的元件只可引用其他強式命名的元件。 如果您的函式庫沒有強命名,則需要強命名的 .NET Framework 應用程式和函式庫將無法使用它。
.NET Framework 上強式命名的優點如下:
- 元件可由其他強名稱元件參考及使用。
- 元件可以儲存在全域程式集緩存 (GAC) 中。
- 組件可以與其他版本的組件並排載入。 具有外掛程式架構的應用程式通常需要並存元件載入。
強式命名在 .NET Core/5+ 平台上沒有任何好處。 C# 編譯程式會對強名稱元件參考非強名稱元件的情況產生 CS8002 警告。 針對以 .NET Core/5+ 為目標的程式庫,可以抑制此警告。
建立具強名稱的 .NET 程式庫
如果開放原始碼 .NET 程式庫的目標包含 .NET Framework 或 .NET Standard,您應該使用強式命名。 針對僅支援 .NET Core/5+ 的程式庫,不需要使用強式命名。
備註
本指南專門針對公開散佈的 .NET 程式庫,例如在 NuGet.org 上發佈的 .NET 程式庫。大多數 .NET 應用程式不需要強式命名,且不應該預設啟用。
✔️ 請考慮將您庫中的組件命名為強名稱。
✔️ 請考慮將強式命名密鑰組 (public + private) 新增至原始檔控制系統。
公開可用的金鑰組可讓開發人員使用相同的金鑰修改和重新編譯連結庫原始程式碼。
如果過去曾使用強式命名密鑰組,在 部分信任案例中授與特殊許可權,您就不應該將強式命名密鑰組公開。 否則,您可能會危害現有的環境。
如果您無法簽入公開 + 私鑰組,請簽入公鑰,並使用 公用簽署 進行一般組建。 公用簽署仍可讓開發人員在大部分情況下重新編譯及使用您的連結庫。
這很重要
需要程式代碼發行者的身分識別時,建議使用 Authenticode 和 NuGet 套件簽署 。 代碼存取安全性 (CAS) 不應作為安全性風險降低。
✔️ 請考慮僅在主要版本變更時遞增組件版本,這樣可以協助使用者減少系結重新導向的需求,並降低更新的頻率。
深入瞭解 版本管理和元件版本。
❌ 請勿新增、移除或變更強式命名金鑰。
修改元件的強式命名密鑰會變更元件的身分識別,並中斷使用它的已編譯程序代碼。 如需詳細資訊,請參閱 二進位相容性破壞性變更。
❌ 請勿發佈強命名和非強命名版本的函式庫。 例如,Contoso.Api
和 Contoso.Api.StrongNamed
。
發佈兩個套件分岔您的開發人員環境。 此外,如果應用程式最終取決於這兩個套件,開發人員可能會遇到類型名稱衝突。 就 .NET 而言,它們是在不同組件中的不同類型。