代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

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

  •  6
  • Lasse V. Karlsen  · 技术社区  · 14 年前

    情况如下:

    1. 我想将完整的源代码发布到类库
    2. 我还想发布由我签名的二进制文件,其中包含一个我不想发布的密钥文件
    3. 我将提供批处理文件和预构建步骤,如果不存在,则在本地创建新的密钥文件,以便任何人都可以快速开始使用源代码
    4. 测试项目需要引用主项目中的内部类
    5. 要访问内部类,我需要添加 [assembly: InternalsVisibleTo("...")] 属性到主项目AssemblyInfo.cs文件
    6. 因为我在签署项目输出,所以需要指定该属性的公钥部分
    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> 项目文件的元素并在生成之前对其进行修改?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Pieter van Ginkel    14 年前

    你可以选择发布一个SNK文件来测试吗?

    你可以吃两个 InternalsVisibleTo 换一个你用的 #if ,例如:

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

    你可以设置 FOR_RELEASE 创建要发布的生成时。

        2
  •  1
  •   Steven    14 年前

    我对我的操作系统项目所做的很简单:我有一个私人SNK,我只在为一个版本构建项目时使用。这些项目只有在我为发行版编译时才被签名,而且通常项目不会引用SNK。这使得使用 InternalsVisibleTo 属性,因为没有SNK,这总是有效的。

        3
  •  1
  •   Hans Passant    14 年前

    一个ifdef会跳入脑海,使用一个你不在乎的“eval”键。

    推荐文章