使用C#interactive访问"内部"类

ric*_*lla 11 c# visual-studio-2015 c#-interactive

使用VS2015中的C#交互式控制台,我想访问标记为的属性和类internal.通常,这是通过将InternalsVisibleAttribute添加到相关项目来完成的.我试过添加csc.exe作为'朋友'程序集,但我仍然有访问问题.

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

Amo*_*dar 2

这是可能的,但我不确定你为什么需要这样做。该类型是内部类型是有原因的。这是如何做到的 -

使用以下代码创建控制台应用程序 -

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
    }
}
Run Code Online (Sandbox Code Playgroud)

添加内部类 -

internal class MyClass
{
    internal string MyMethod()
    {
        return "Hello world!";
    }
}
Run Code Online (Sandbox Code Playgroud)

构建您的解决方案。在你的 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!
>
Run Code Online (Sandbox Code Playgroud)

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