使用C#交互式工具访问“内部”类

14

我想在VS2015中使用C#交互式控制台访问标记为internal的属性和类。通常,这可以通过向涉及的项目添加InternalsVisibleAttribute来完成。我已尝试将csc.exe添加为“友元”程序集,但仍然存在访问问题。

  1. 通过C#交互式控制台访问内部类成员的方法是否正确?
  2. 如果是,我需要哪个dll/exe才能使内部可见?

不确定是否正确,但是在Visual Studio 2015中,基于Roslyn的C#编译器可执行文件被称为rcsc.exe吗? - stakx - no longer contributing
1
话虽如此,我认为将 [InternalsVisible] 传递给编译器不会产生预期的效果。我猜想交互式控制台中的代码被编译成某个匿名动态程序集;你必须将内部可见性设置为该程序集才行。 - stakx - no longer contributing
你可能需要在devenv和csi中添加InternalsVisible。 - Paulo Morgado
2
我在 REPL 中运行了 Assembly.GetExecutingAssembly,发现每个语句都会生成一个新的程序集,名称类似于:“ℛ*8e0ec57a-a9aa-4868-a1f0-57691117fa1f#1-2,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”。名称的最后一位数字(在这种情况下是“2”)会在每行中递增。因此,我尝试在项目的 AssemblyInfo 文件中添加几个 InternalsVisibleTo 行,并使用这些名称序列引用重建的项目到打开的 REPL 中。可惜,这个看似合理的想法并没有奏效(内部仍然不可见)。 - Jan Hettich
1个回答

2
这是可以实现的,但我不确定你为什么需要这样做。这种类型是有内部原因的。以下是如何完成它:
创建一个控制台应用程序,其中包含以下代码 -
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
    }
}

添加内部类 -
internal class MyClass
{
    internal string MyMethod()
    {
        return "Hello world!";
    }
}

构建您的解决方案。 在您的 C# 交互窗口中 -

>#r "C:\Users\...\Project.dll"
>using System;
>using System.Reflection;
>Assembly assembly = >Assembly.LoadFrom("C:\Users\...\Project.dll");
> Object mc = assembly.CreateInstance("AccessInternal.MyClass");
> Type t = mc.GetType();
> BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic;
> MethodInfo mi = t.GetMethod("MyMethod", bf);
> string result = (string)mi.Invoke(mc, null);
> Console.WriteLine(result);
Hello world!
>

注意:由于这是c#交互窗口,它不会加载您目标组件的依赖对象,即如果您的程序集引用了在内部方法中被引用的其他程序集,则除非c#交互窗口可以访问并加载这些程序集,否则它将无法执行该方法。

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