释放类库源,无需签名密钥文件,但是单元测试需要访问内部类,该怎么办?

ang*_*son 6 .net code-signing internalsvisibleto assembly-signing

情况如下:

  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

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

我唯一的选择是删除签署项目的设置,并修改项目文件作为我的二进制文件构建脚本的一部分?即.<SignAssembly>false</SignAssembly>在构建之前,搜索项目文件的元素并进行修改?

Pie*_*kel 2

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

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

#if FOR_RELEASE
[InternalsVisibleTo(... your private SNK ...)]
#else
[InternalsVisibleTo(... test SNK which you release ...)]
#endif
Run Code Online (Sandbox Code Playgroud)

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