6

情况如下:

  1. 我想将完整的源代码发布到类库
  2. 我也想发布二进制文件,由我签名,带有我不想发布的密钥文件
  3. 我将提供批处理文件和预构建步骤,如果不存在,它们会在本地创建一个新的密钥文件,以便任何人都可以快速开始使用源代码
  4. 测试项目需要引用主项目中的一个内部类
  5. 要访问内部类,我需要[assembly: InternalsVisibleTo("...")]在主项目 AssemblyInfo.cs 文件中添加一个属性
  6. 由于我正在签署项目输出,因此我需要指定该属性的 PublicKey 部分
  7. 然后这将绑定到我不愿意发布的密钥文件

那么,我该如何解决呢?

如果我对主项目输出而不是测试库进行签名,并且在InternalsVisibleTo属性中仅指定程序集名称,则会收到以下编译时错误:

错误 1 ​​朋友程序集引用“Mercurial.Net.Tests”无效。强名称签名的程序集必须在其 InternalsVisibleTo 声明中指定一个公钥。C:\Dev\VS.NET\Mercurial.Net\Mercurial.Net\Properties\AssemblyInfo.cs 22 31 Mercurial.Net

所以显然不签署测试项目输出是不够的。

我唯一的选择是删除签署项目的设置,并将项目文件修改为我的二进制文件构建脚本的一部分吗?IE。在构建之前寻找<SignAssembly>false</SignAssembly>项目文件的元素并对其进行修改?

4

3 回答 3

2

是否可以选择发布仅用于测试的 SNK 文件?

然后,您可以拥有两个InternalsVisibleTo并使用 切换使用哪个#if,例如:

#if FOR_RELEASE
[InternalsVisibleTo(... your private SNK ...)]
#else
[InternalsVisibleTo(... test SNK which you release ...)]
#endif

然后FOR_RELEASE,您可以在创建要发布的构建时进行设置。

于 2010-11-14T20:17:51.197 回答
1

我对我的操作系统项目所做的事情很简单:我有一个私有 SNK,我只在构建项目以进行发布时使用它。这些项目仅在我为发布进行编译时签名,并且通常这些项目不引用 SNK。这使得使用该属性变得很容易InternalsVisibleTo,因为没有 SNK 这总是有效的。

于 2010-11-14T20:03:35.100 回答
1

#ifdef 使用您不关心的“eval”键跳到脑海。

于 2010-11-14T20:18:48.947 回答