如何:使用强名称为程序集签名

注意

虽然 .NET Core 支持强名称程序集,而且 .NET Core 库中的所有程序集均已签名,但大多数第三方程序集不需要强名称。 有关详细信息,请参阅 GitHub 上的强名称签名

可通过许多方法为程序集签署强名称:

  • 使用 Visual Studio 中项目的项目设计器中的“生成”>“强命名”页。 这是为程序集签署强名称的最简单且最方便的方法。
  • 通过使用程序集链接器 (Al.exe) 来链接 .NET Framework 代码模块(.netmodule 文件)与密钥文件。
  • 通过使用程序集特性将强名称信息插入代码中。 你可以使用 AssemblyKeyFileAttributeAssemblyKeyNameAttribute 特性,具体取决于要使用的密钥文件所在的位置。
  • 通过使用编译器选项。

要使用强名称为程序集签名,必须具有加密密钥对。 有关创建密钥对的详细信息,请参阅如何:创建公钥/私钥对

使用 Visual Studio 创建程序集并使用强名称为程序集签名

  1. 在“解决方案资源管理器” 中,打开项目的快捷菜单,然后选择“属性” 。
  2. 在“生成”选项卡下,可以找到“强命名”节点。
  3. 勾选“为程序集签名”复选框,可展开选项。
  4. 选择“浏览”按钮以选择“强命名密钥文件”路径。

注意

为了延迟为程序集签名,请选择公钥文件。

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

使用程序集链接器创建程序集并使用强名称为程序集签名

打开 Visual Studio 开发人员命令提示或 Visual Studio 开发人员 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)。 你可以忽略这些警告。

下面的代码示例将 AssemblyKeyFileAttribute 属性用于名为 keyfile.snk 的密钥文件(位于编译程序集的目录中)。

[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

请参阅