【问题标题】:Is there an easy way to use InternalsVisibleToAttribute?有没有简单的方法来使用 InternalsVisibleToAttribute?
【发布时间】:2010-10-14 22:09:23
【问题描述】:

我有一个 C# 项目和一个带有主项目单元测试的测试项目。我想拥有可测试的 internal 方法,并且我想在没有 Visual Studio 测试项目中可以拥有的神奇 Accessor 对象的情况下测试它们。我想使用 InternalsVisibleToAttribute 但每次我完成它时,我都必须返回并查找如何操作,我记得这涉及创建用于签署程序集的密钥文件,然后使用sn.exe 获取公钥等。

  • 是否有一个实用程序可以自动执行创建 SNK 文件、设置项目以签署程序集、提取公钥和应用 InternalsVisibleTo 属性的过程?强>

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

【问题讨论】:

    标签: 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”是内部方法的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        • 2018-02-16
        • 1970-01-01
        • 2022-11-20
        • 1970-01-01
        • 2010-09-19
        • 2017-11-25
        相关资源
        最近更新 更多