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

标签 .net code-signing internalsvisibleto assembly-signing

情况如下:

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

  • 那么,我该如何解决呢?

    如果我签署了主项目输出,而不是测试库,并且只在 InternalsVisibleTo 中指定程序集名称属性,我得到这个编译时错误:

    Error 1 Friend assembly reference 'Mercurial.Net.Tests' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations. C:\Dev\VS.NET\Mercurial.Net\Mercurial.Net\Properties\AssemblyInfo.cs 22 31 Mercurial.Net



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

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

    最佳答案

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

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

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

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

    关于.net - 发布类库源,不签署 key 文件,但单元测试需要访问内部类,怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4179363/

    相关文章:

    c# - MVC 4 如何正确地将数据从 Controller 传递到 View

    mysql - 如何使用 MySQL .net 连接器为大型数据集流式传输结果集

    code-signing - 哪里下载signcode.exe等工具

    ios - 供应配置文件不包括应用程序标识符和钥匙串(keychain)访问组权利

    c# - InternalsVisibleTo 属性不起作用

    .net - 当对象超出 .Net 的范围时可以运行代码吗?

    c# - Selenium:By.Id ("myelement") 和 By.Css ("#myelement") 之间是否存在性能差异?

    xcode - FaSTLane与多个应用程序匹配

    c# - 我可以将 InternalsVisibleTo 用于 C++ 托管代码吗?