【问题标题】:How can I investigate non-working InternalsVisibleTo attribute?如何调查无效的 InternalsVisibleTo 属性?
【发布时间】:2015-10-28 08:04:17
【问题描述】:

我正在尝试使单元测试项目可以看到类库的内部结构。类库和单元测试项目均已签名;我们在 VS-2013 中使用了项目属性页,勾选了签名框,让 VS 创建一个密钥文件。

我在开发人员命令工具上使用了“sn -Tp NUnitTests.dll”来提取公钥(真正匿名的 MS 并没有提供简单的“选择 DLL”GUI 方式来完成这些繁琐的工作——但我离题了)。

在类库的 AssemblyInfo.cs 中,我已经插入了

[assembly: InternalsVisibleTo("MyProject.NUnitTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100fbd5b3dfc3247de89f1940718fbecda5fc6f9e19a17515a5af8004555d1f1bc9720dfa522ccf414c2f79c659528053a3ba0083333e5d1ae9d7a674d032386b5180e78cacad2e1f16f2f2cf005452615a5d06c6c6911665e8f66112c568bcd93ae93bd4cce348f3e2c5f8ea9156abd19119773ebe329728ae9558210aa8181be2")]

只要我不测试任何内部组件,这两个项目都可以正常构建,但如果我尝试这样做,我会遇到与未暴露内部组件时相同的构建错误。例如。如果类库包含

public class Foo 
{
    internal static void Bar() {}
}

测试确实如此

Foo.Bar();

我收到一个错误,声称 Foo 没有该方法。

我已经检查、反复检查和三次检查名称和密钥是否正确。我已经清空了 GAC 并进行了重建(正如我有时所经历的那样,该构建似乎使用了 GAC 版本的程序集,即使我重建时也是如此 - 不确定这是关于什么的)。我已经用 ildasm 查看了清单并在那里验证了公钥(只有大小写不同,这对于 HEX 数据应该没有太大关系;无论如何我在属性值中使用小写,如 sn.exe)。我已经尝试从 NUnitTests 中删除并重新添加到类库的引用。我已经重新启动了 VS-2013。

用尽了所有令人沮丧的“尝试你能想到的一切,即使你不知道它为什么会起作用”选项,我想知道是否有更好的方法。

如果这很重要,我们的目标是 fw 3.5。

【问题讨论】:

  • 很难说“MyProject.NUnitTests”可能是什么。您必须指定程序集名称,只需简单的“NUnitTests”。

标签: .net unit-testing


【解决方案1】:

这很尴尬!

程序集名称确实是“NUnitTests”而不是“MyProject.NUnitTests”(尽管 Hans Passant 怎么可能拥有这方面的知识我无法理解!)。

这很容易让你...

我仍然认为 Microsoft 可以让我们更轻松地做到这一点。使用内部修饰符很有用,并且能够有选择地将它们公开给其他组件对于任何制作库的人来说都是一个巨大的简化,这就是我们所有人所做的事情(即使消费者是同一组织中的“只是”人,也许在同一个系统上工作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2017-03-10
    • 2011-07-10
    • 2018-01-01
    相关资源
    最近更新 更多