更新:2007 年 11 月

错误消息

使用命令行选项“compiler_option”或适当项目设置代替“attribute_name”

为给程序集签名,必须指定密钥文件。在 Microsoft Visual C# 2005 之前,您在源代码中使用 CLR 属性指定了密钥文件。现在,这些属性都被否决了。

从 Microsoft Visual C# 2005 开始,您应使用“项目设计器”“签名页”或程序集链接器指定密钥文件。

“项目设计器”“签名页”是首选方法;有关更多信息,请参见 “项目设计器”->“签名”页管理程序集签名和清单签名

如何:使用强名称为程序集签名 使用如下编译器选项:

否决这些属性的原因是:

  • 存在安全问题,因为这些属性嵌入在由编译器生成的二进制文件中。因此,每个拥有您的二进制文件的人都会获得存储在其中的密钥。

  • 存在可用性问题,因为属性中指定的路径是相对于当前工作目录(此目录在集成开发环境 (IDE) 中可能会发生更改)或输出目录的。因此,大多数情况下密钥文件有可能是 ..\\..\\mykey.snk。这些属性还增加了项目系统为附属程序集正确签名的难度。当您使用编译器选项代替这些属性时,可以使用密钥的完全限定路径和文件名,而无需在输出文件中嵌入任何内容;项目系统和源代码管理系统可在项目移动时正确处理该完整路径;项目系统可保留密钥文件的项目相对路径,同时仍将完整路径传递给编译器;其他生成程序可通过直接将适当的路径传递给编译器(而不是用正确的属性生成源文件)更加容易地为输出签名。

  • 将属性用于友元程序集会影响编译器的效率。当您使用属性时,编译器在必须决定是否授予友元关系时不知道密钥是什么,因此它必须进行推测。在编译的最后,一旦编译器最后知道了密钥,它就能够对推测进行验证。当使用编译器选项指定密钥文件时,编译器可立即决定是否授予友元关系。

示例

下面的示例生成 CS1699。若要解决此错误,请移除该属性并使用 /delaysign 进行编译。

 复制代码
// CS1699.cs
// compile with: /target:library
[assembly:System.Reflection.AssemblyDelaySign(true)]   // CS1699

请参见

任务

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

参考

“项目设计器”->“签名”页

其他资源

管理程序集签名和清单签名