有一种简单的方法可以使用InternalsVisibleToAttribute吗?

时间:2009-03-23 07:48:55

标签: c# .net visual-studio

我有一个C#项目和一个带有主项目单元测试的测试项目。我希望有可测试的internal方法,我想测试它们没有Visual Studio测试项目可以拥有的神奇Accessor对象。我想使用 InternalsVisibleToAttribute ,但每次我都这样做时,我必须回过头来查看如何操作,我记得这包括创建用于签署程序集的密钥文件然后使用sn.exe获取公钥等。

  • 是否有一个实用程序可以自动创建SNK文件,设置项目以对程序集进行签名,提取公钥以及应用 InternalsVisibleTo 属性?

  • 有没有办法在没有签名的程序集的情况下使用属性?

3 个答案:

答案 0 :(得分:35)

您不必使用已签名的程序集来使用InternalsVisibleTo。如果不使用签名的程序集,则只需输入程序集的全名即可。

因此,如果您希望有权访问测试程序集中的MyAssemblyMyAssembly.Test),AssemblyInfo.cs MyAssembly所需的全部内容就像测试程序集的名称一样这样:

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

答案 1 :(得分:13)

Brian是对的,但是,在某些情况下,你有一个签名的程序集,你确实希望得到该程序集的公钥。

获得此密钥确实非常麻烦 因此,我做到了这一点:
我已经在VS.NET中定制了我的外部工具,这样我只需点击一下鼠标即可获得当前项目程序集的公钥。
这就是它的完成方式:

  • 在VS.NET中,打开“工具”菜单,然后单击“外部工具”
  • 一个名为“外部”的窗口 工具'将打开
  • 点击添加
  • 对于标题,请输入“获取公钥”
  • 在“命令”中,输入C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe
  • 在“参数”中,键入:-Tp $(TargetPath)
  • 确保选中“使用输出” window'选项

然后,您构建项目,当您单击“获取公钥”时,您应该在输出窗口中看到此项目的公钥。

答案 2 :(得分:3)

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

        BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;

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

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