【问题标题】:Is there an easy way to use InternalsVisibleToAttribute?有没有简单的方法来使用 InternalsVisibleToAttribute?
【发布时间】:2010-10-14 22:09:23
【问题描述】:
我有一个 C# 项目和一个带有主项目单元测试的测试项目。我想拥有可测试的 internal 方法,并且我想在没有 Visual Studio 测试项目中可以拥有的神奇 Accessor 对象的情况下测试它们。我想使用 InternalsVisibleToAttribute 但每次我完成它时,我都必须返回并查找如何操作,我记得这涉及创建用于签署程序集的密钥文件,然后使用sn.exe 获取公钥等。
【问题讨论】:
标签:
c#
.net
visual-studio
【解决方案1】:
您不必使用签名程序集来使用InternalsVisibleTo。如果不使用签名程序集,则只需输入程序集的全名即可。
因此,如果您想在您的测试程序集 (MyAssembly.Test) 中访问 MyAssembly,那么您在 AssemblyInfo.cs for MyAssembly 中所需要的就是测试程序集的名称,如下所示:
[assembly: InternalsVisibleTo("CompanyName.Project.MyAssembly.Test")]
【解决方案2】:
Brian 是对的,但是,在某些情况下,您确实有一个已签名的程序集,并且您确实希望获得该程序集的公钥。
获取这个密钥确实很麻烦。
因此,我这样做了:
我在VS.NET中自定义了我的外部工具,这样我就可以一键获取当前项目的程序集的公钥。
它是这样完成的:
- 在 VS.NET 中,打开“工具”菜单,然后单击“外部工具”
- 名为“外部”的窗口
工具会打开
- 点击添加
- 对于标题,输入“获取公钥”
- 在“命令”中,输入
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe
- 在“参数”中,输入:
-Tp $(TargetPath)
- 确保选中“使用输出”
窗口选项
然后,您构建项目,当您单击“获取公钥”时,您应该会在输出窗口中看到该项目的公钥。
【解决方案3】:
还有另一种调用内部方法的替代方法,那就是使用“反射”。
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
MethodInfo minfo = typeof(BaseClassName).GetMethod("MethodName", bindingFlags);
BaseClassName b = new BaseClassName();
minfo.Invoke(b, null);
这里我假设“BaseClassName”是来自另一个类库的类的名称,“MethodName”是内部方法的名称。