有没有一种简单的方法使用InternalsVisibleToAttribute?

34

我有一个C#项目和一个针对主项目的单元测试的测试项目。我希望拥有可测试的内部(internal)方法,而且我想在没有Visual Studio测试项目中可以使用的神奇访问器(Accessor)对象的情况下测试它们。我想使用InternalsVisibleToAttribute,但每次我这样做,我都必须回去查看如何执行此操作,我记得这涉及创建用于签名程序集的密钥文件,然后使用sn.exe获取公钥等等。

  • 是否有一种工具可以自动化创建SNK文件、将项目设置为签名程序集、提取公钥并应用 InternalsVisibleTo 属性的过程?

  • 有没有一种方法可以在没有签名程序集的情况下使用该属性?

4个回答

43

使用InternalsVisibleTo时,不必使用已签名程序集。如果您不使用已签名的程序集,只需输入程序集的完整名称。

因此,如果您想在测试程序集(MyAssembly.Test)中访问MyAssembly,则MyAssemblyAssemblyInfo.cs中所需的只是测试程序集名称:

[assembly: InternalsVisibleTo("CompanyName.Project.MyAssembly.Test")]

14
Brian是对的,但当然在某些情况下,你确实有一个已签名的程序集,并且你确实想要获取该程序集的公钥。
获取这个密钥确实相当麻烦。 因此,我已经这样做了: 我在VS.NET中自定义了我的外部工具,这样我只需点击鼠标一次就可以获取当前项目的程序集的公钥。 具体操作如下:
1. 在VS.NET中,打开“工具”菜单,点击“外部工具”。 2. 一个名为“外部工具”的窗口将打开。 3. 点击“添加”。 4. 在标题中输入“获取公钥”。 5. 在“命令”中输入:C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe。 6. 在“参数”中输入:-Tp $(TargetPath)。 7. 确保选中“使用输出窗口”选项。
然后,你构建项目,当你点击“获取公钥”时,你应该在输出窗口中看到该项目的公钥。

2
我也使用了像反编译器ilspy这样的工具来获取相同的信息。 - Shaun Wilde

4

还有一种调用内部方法的替代方法,即使用“反射”。

        BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;

        MethodInfo minfo = typeof(BaseClassName).GetMethod("MethodName", bindingFlags);
        BaseClassName b = new BaseClassName();            
        minfo.Invoke(b, null);

在这里,我假设 "BaseClassName" 是来自另一个类库的类名称,而 "MethodName" 则是内部方法的名称。


2
这些天你可以将以下内容添加到你的 .csproj 文件中。
例子
<ItemGroup>
  <InternalsVisibleTo Include="BuberDinner.Api.Tests" />
</ItemGroup>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接