如何创建延迟签名的共享程序集
为程序集提供强名称需要两个加密密钥:一个公钥和一个私钥。该密钥对在生成时传递给编译器(像如何创建带有强名称的程序集中所描述的那样),以创建强名称。
但是,生成程序集的人并不总具有对强命名所需私钥的访问权限。这在具有集中签名实体严密保护私钥的公司中最常见。只有少数经过选择的人具有对这些密钥的访问权限。另外,分配强名称的进程不能在生成以后进行,因为公钥是程序集标识的组成部分,并且必须在生成时提供,以便程序集的客户端可以针对完整程序集标识进行编译。
“.NET 框架”提供延迟签名,它将分配强名称的进程实际拆分为两步:
- 1. 在生成时,将公钥提供给编译器,以便能够将其记录在程序集清单的 PublicKey 字段中。另外,文件中为签名保留空间,尽管此时并不生成实际签名。
- 2. 以后某个时间,生成实际签名并将其存储在文件中。签名生成通过“强命名”工具 (Sn.exe) 的 -R 开关来完成。
当在源代码中包括 System.Reflection.AssemblyDelaySignAttribute 时,它向编译器指示程序集需要以延迟签名创建。您还需要使用 AssemblyKeyFileAttribute 以包括公钥。通常,签名实体将使用 SN -k 来生成密钥对,并将它存储在文件中。接下来,它使用 SN -p 将公钥从该文件提出。然后可以公布公钥,而私钥仍保密。
sn -k Testkey.snk
sn -p Testkey.snk TestPublicKey.snk下面的示例使用 AssemblyKeyFileAttribute 和 AssemblyDelaySignAttribute 来创建延迟签名的程序集。在 Visual Basic 中,程序集级别的属性必须是文件中的第一组语句。
using System;
using System.Reflection;
[assembly:AssemblyKeyFileAttribute("TestPublicKey.snk")]
[assembly:AssemblyDelaySignAttribute(true)]
由于示例中的程序集没有有效签名,因此当试图将程序集安装到全局程序集缓存中或将它从应用程序目录加载时,由公共语言运行库执行的签名验证将失败。但是,可使用“强名称”工具通过 -Vr 选项禁用特定程序集的签名验证:
sn -Vr DelaySign.dll有效签名必须在程序集发送给客户以前使用 sn -R 生成。这通常由公司签名实体完成。您必须提供完整的密钥对才能创建有效签名。
sn -R DelaySign.dll Testkey.snk

浙公网安备 33010602011771号