操作說明:使用強式名稱簽署組件

注意

雖然 .NET Core 支援強式名稱組件,而且 .NET Core 程式庫中的所有組件都經過簽署,但大部分的協力廠商組件都不需要強式名稱。 如需詳細資訊,請參閱 GitHub 上的 強式名稱簽署 (英文)。

以下是幾種以強式名稱簽署組件的方式:

  • 在 Visual Studio 專案的專案設計工具中,使用[建置]>[強式命名] 頁面。 這是最簡單、最方便以強式名稱簽署組件的方式。
  • 透過使用組件連結器 (Al.exe) 將 .NET Framework 程式碼模組 (.netmodule 檔) 與金鑰檔連結在一起。
  • 使用組件屬性將強式名稱資訊插入您的程式碼。 您可以使用 AssemblyKeyFileAttributeAssemblyKeyNameAttribute 屬性,視使用的金鑰檔所在位置而定。
  • 使用編譯器選項。

您必須使用密碼編譯金鑰組將組件簽署為強式名稱。 如需建立金鑰組 (Key Pair) 的詳細資訊,請參閱如何:建立公開/私密金鑰組

使用 Visual Studio 建立組件並以強式名稱簽署組件

  1. 方案總管中,開啟專案的捷徑功能表,然後選擇 [屬性]
  2. 在 [建置] 索引標籤下,您會看到 [強式命名] 節點。
  3. 選取 [簽署組件] 核取方塊以展開選項。
  4. 選取 [瀏覽] 按鈕以選擇 [強式名稱金鑰檔案] 路徑。

注意

若要延遲簽署組件,請選擇公開金鑰檔案。

Visual Studio 2022: Project properties, Build / Strong naming section.

使用組件連結器建立組件並以強式名稱簽署組件

開啟 Visual Studio 開發人員命令提示字元或 Visual Studio Developer PowerShell,然後輸入下列命令:

al/out:<assemblyName><moduleName>/keyfile:<keyfileName>

其中:

  • assemblyName 是組件連結器將發出的強式簽署組件名稱 (.dll.exe 檔)。
  • moduleName 是 .NET Framework 程式碼模組 (.netmodule 檔) 的名稱,其中包括一或多個類型。 您可以在 C# 或 Visual Basic 中使用 /target:module 參數編譯程式碼,藉此建立 .netmodule 檔。
  • keyfileName 是包含金鑰組的容器或檔案名稱。 組件連結器會解譯與目前目錄關聯的相對路徑。

下列範例將使用金鑰檔 sgKey.snk 以強式名稱簽署組件 MyAssembly.dll

al /out:MyAssembly.dll MyModule.netmodule /keyfile:sgKey.snk

如需這項工具的詳細資訊,請參閱 組件連結器

使用屬性以強式名稱簽署組件

  1. System.Reflection.AssemblyKeyFileAttributeAssemblyKeyNameAttribute 屬性加入至您的原始程式碼檔,並指定容器或檔案名稱,其中包含以強式名稱簽署組件時所使用的金鑰組。

  2. 以一般方式編譯原始程式碼檔。

    注意

    C# 和 Visual Basic 編譯器在原始程式碼中遇到 AssemblyKeyFileAttributeAssemblyKeyNameAttribute 屬性時,會發出編譯器警告 (分別為 CS1699 和 BC41008)。 您可以忽略這些警告。

下列範例將搭配稱為 keyfile.snk 的金鑰檔使用 AssemblyKeyFileAttribute 屬性,這個金鑰檔位於編譯組件所在的目錄中。

[assembly:AssemblyKeyFileAttribute("keyfile.snk")];
[assembly:AssemblyKeyFileAttribute("keyfile.snk")]
<Assembly:AssemblyKeyFileAttribute("keyfile.snk")>

您也可以在編譯原始程式檔時延遲簽署組件。 如需詳細資訊,請參閱延遲簽署組件

使用編譯器以強式名稱簽署組件

在 C# 和 Visual Basic 中使用 /keyfile/delaysign 編譯器選項,或是在 C++ 中使用 /KEYFILE/DELAYSIGN 連結器選項編譯原始程式碼檔。 在選項名稱後面加上冒號和金鑰檔的名稱。 使用命令列編譯器時,您可以將金鑰檔複製到包含您的原始程式碼檔的目錄中。

如需延遲簽署的詳細資訊,請參閱延遲簽署組件

下列範例將使用 C# 編譯器,並且使用金鑰檔 sgKey.snk 以強式名稱簽署 UtilityLibrary.dll 組件。

csc /t:library UtilityLibrary.cs /keyfile:sgKey.snk

另請參閱