Visual Studio 是否有一种简单的方法来使用InternalsVisibleToAttribute?

bkhjykvo  于 2022-12-23  发布在  其他
关注(0)|答案(4)|浏览(139)

我有一个C#项目和一个测试项目,主项目有单元测试。我想有可测试的internal方法,我想测试它们,而不使用Visual Studio测试项目中可以使用的神奇访问器对象。我想使用**InternalsVisibleToAttribute**,但每次我这样做时,我都不得不回去查看如何做。我记得这涉及到创建用于对程序集进行签名的密钥文件,然后使用sn.exe获取公钥等。

*是否有一个实用程序可以自动执行创建SNK文件、设置项目以签署程序集、提取公钥以及应用 InternalsVisibleTo 属性的过程?
*是否可以在没有 * 已签名程序集的情况下使用 * 属性?

toe95027

toe950271#

使用InternalsVisibleTo时不必使用已签名的程序集。如果不使用已签名的程序集,只需输入程序集的全名。
因此,如果您想访问测试程序集(MyAssembly.Test)中的MyAssembly,那么在AssemblyInfo.cs中,对于MyAssembly,您只需要测试程序集的名称,如下所示:

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

noj0wjuj2#

布莱恩是对的,但是,当然在某些情况下,你确实有一个签名的程序集,你确实想得到那个程序集的公钥。
拿到这把钥匙确实相当麻烦。
因此,我这样做:
我已经在VS.NET中定制了外部工具,这样我只需单击鼠标就可以获得当前项目程序集的公钥。
这是怎么做到的:

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

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

yqyhoc1h

yqyhoc1h3#

还有另一种方法可以调用内部方法,那就是使用“反射”。

BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;

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

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

sz81bmfz

sz81bmfz4#

现在您可以将以下内容添加到.csproj文件中。
示例

<ItemGroup>
  <InternalsVisibleTo Include="BuberDinner.Api.Tests" />
</ItemGroup>

相关问题