Доступ к "внутренним" классам с C# интерактивным

Используя интерактивную консоль C# в VS2015, я хочу получить доступ к свойствам и классам, помеченным как internal, Обычно это делается путем добавления атрибута InternalsVisibleAttribute к рассматриваемому проекту. Я попытался добавить csc.exe как сборку "друга", но у меня все еще есть проблемы с доступом.

  1. Это правильный подход для доступа к внутренним членам класса через интерактивную консоль C#?
  2. Если да, то какая dll/exe мне нужна, чтобы внутренности были видны?

0 ответов

Это возможно, но я не уверен, зачем вам это нужно. Тип является внутренним не просто так. Вот как это можно сделать -

Создайте консольное приложение со следующим кодом -

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

Добавьте внутренний класс -

internal class MyClass
{
    internal string MyMethod()
    {
        return "Hello world!";
    }
}

Создайте свое решение. В вашем интерактивном окне С # -

>#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# не сможет выполнить метод, если только он имеет доступ к этим сборкам и может их загружать.

Другие вопросы по тегам