強式命名

強式命名是指使用金鑰對組件進行簽名,進而產生強式名稱組件。 當組件具有強式名稱時,它會根據名稱與組件版本號碼建立唯一身分識別,而且它可以協助防止組件衝突。

強式命名的缺點是,一旦組件具有強式名稱,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、Xamarin、UWP 與其他大部分的 .NET 實作沒有嚴格的組件載入,這是強式命名的主要缺點。

.NET Framework 上強式命名的一個重要層面是它是病毒式:強式命名組件只能參考其他強式名稱組件。 如果您的程式庫沒有強式名稱,則需要強式命名的 .NET Framework 應用程式和程式庫無法使用它。

.NET Framework 上強式命名的優點如下:

  1. 組件可以被其他強式名稱組件參考及使用。
  2. 組件可以儲存於全域組件快取 (GAC)。
  3. 組件可以組件的其他版本並存載入。 具有外掛程式架構的應用程式通常需要並存組件載入。

強式命名在 .NET Core/5+ 上沒有優點。 C# 編譯程式會針對參考非強式名稱組件的強式名稱組件產生 CS8002 警告。 針對以 .NET Core/5+ 為目標的程式庫,隱藏此警告不會有問題。

建立強式命名的 .NET 程式庫

如果開放原始碼 .NET 程式庫的目標包含 .NET Framework 或 .NET Standard,您應該使用強式名稱。 只有以 .NET Core/5+ 為目標的程式庫不需要強式命名。

注意

此指南僅適用於公開的分散式 .NET 程式庫,例如在 NuGet.org 上發行的 .NET 程式庫。大部分的 .NET 應用程式都不需要強式命名,根據預設不應該這樣做。

✔️ 考慮為您的程式庫組件進行強式命名。

✔️ 考慮將強式命名金鑰新增至您的原始檔控制系統。

公開可用的金鑰可讓開發人員使用相同的金鑰修改及編譯您的程式庫原始程式碼。

如果過去曾使用強式命名金鑰在部分信任案例中授與特殊權限,則不應將它公開。 否則,您可能會危及現有的環境。

重要

當需要程式碼發行者的身分識別時,建議使用 AuthenticodeNuGet 套件簽署。 程式碼存取安全性 (CAS) 不應作為安全性風險降低機制使用。

✔️ 考慮僅在主要版本變更時遞增組件版本,以協助使用者減少繫結重新導向,以及更新它們的頻率。

深入了解版本控制與組件版本

❌ 請「勿」新增、移除或變更強式命名金鑰。

修改組件的強式命名金鑰會變更組件的身分識別,並且中斷使用它的編譯程式碼。 如需詳細資訊,請參閱二進位中斷性變更

❌ 禁止發行程式庫的強式名稱和非強式名稱版本。 例如 Contoso.ApiContoso.Api.StrongNamed

發佈兩個套件會派生您的開發人員生態系統。 此外,如果應用程式最後根據這兩個套件,開發人員可能會遇到類型名稱衝突。 就 .NET 而言,它們在不同的組件中是不同的類型。