.net 发布类库源代码,不签署密钥文件,但单元测试需要访问内部类,该怎么办?
情况如下:.net 发布类库源代码,不签署密钥文件,但单元测试需要访问内部类,该怎么办?,.net,code-signing,internalsvisibleto,assembly-signing,.net,Code Signing,Internalsvisibleto,Assembly Signing,情况如下: 我想将完整的源代码发布到类库中 我还想发布由我签名的二进制文件,其中包含一个我不想发布的密钥文件 我将提供批处理文件和预构建步骤,如果不存在,则在本地创建一个新的密钥文件,以便任何人都可以快速开始使用源代码 测试项目需要引用主项目中的内部类 要访问内部类,我需要向主项目AssemblyInfo.cs文件添加[assembly:InternalsVisibleTo(“…”)属性 因为我要对项目输出进行签名,所以需要指定该属性的公钥部分 这将被绑定到我不愿意发布的密钥文件 那么,我该如何
[assembly:InternalsVisibleTo(“…”)
属性InternalsVisibleTo
属性中仅指定程序集名称,则会出现以下编译时错误:
错误1好友程序集引用“Mercurial.Net.Tests”无效。强名称签名的程序集必须在其InternalsVisibleTo声明中指定公钥。C:\Dev\VS.NET\Mercurial.NET\Mercurial.NET\Properties\AssemblyInfo.cs 22 31 Mercurial.NET
因此,显然不签署测试项目输出是不够的
是否只有删除为项目签名的设置,并将项目文件作为二进制文件生成脚本的一部分进行修改?例如,在构建之前,查找项目文件的
false
元素并对其进行修改?我对我的操作系统项目所做的很简单:我有一个私有SNK,我只在为发布版构建项目时使用。这些项目只有在我为发布版编译时才被签署,通常这些项目不会引用SNK。这使得使用InternalsVisibleTo
属性变得很容易,因为如果没有SNK,这总是有效的。是否可以选择发布SNK文件以进行测试?
然后,您可以有两个内部可视对象
,并在#if
中切换使用哪一个,例如:
#if FOR_RELEASE
[InternalsVisibleTo(... your private SNK ...)]
#else
[InternalsVisibleTo(... test SNK which you release ...)]
#endif
然后,当您创建要发布的版本时,您可以为发布版设置
。一个ifdef跳转到脑海中,使用一个您不关心的“eval”键。是的,听起来像是一个计划。我只使用了。\n如果调试,发布版现在需要我的私钥,我可以很容易地将这部分编写为生成二进制文件的脚本的一部分。反正我还没到那里,所以我以后再处理这部分。所有答案都有很好的选择,但这是我最后要做的,所以我接受了。好了,你看。很高兴我能帮忙。