.net 发布类库源代码,不签署密钥文件,但单元测试需要访问内部类,该怎么办?

.net 发布类库源代码,不签署密钥文件,但单元测试需要访问内部类,该怎么办?,.net,code-signing,internalsvisibleto,assembly-signing,.net,Code Signing,Internalsvisibleto,Assembly Signing,情况如下: 我想将完整的源代码发布到类库中 我还想发布由我签名的二进制文件,其中包含一个我不想发布的密钥文件 我将提供批处理文件和预构建步骤,如果不存在,则在本地创建一个新的密钥文件,以便任何人都可以快速开始使用源代码 测试项目需要引用主项目中的内部类 要访问内部类,我需要向主项目AssemblyInfo.cs文件添加[assembly:InternalsVisibleTo(“…”)属性 因为我要对项目输出进行签名,所以需要指定该属性的公钥部分 这将被绑定到我不愿意发布的密钥文件 那么,我该如何

情况如下:

  • 我想将完整的源代码发布到类库中
  • 我还想发布由我签名的二进制文件,其中包含一个我不想发布的密钥文件
  • 我将提供批处理文件和预构建步骤,如果不存在,则在本地创建一个新的密钥文件,以便任何人都可以快速开始使用源代码
  • 测试项目需要引用主项目中的内部类
  • 要访问内部类,我需要向主项目AssemblyInfo.cs文件添加
    [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如果调试
    ,发布版现在需要我的私钥,我可以很容易地将这部分编写为生成二进制文件的脚本的一部分。反正我还没到那里,所以我以后再处理这部分。所有答案都有很好的选择,但这是我最后要做的,所以我接受了。好了,你看。很高兴我能帮忙。