Доступ к "внутренним" классам с C# интерактивным
Используя интерактивную консоль C# в VS2015, я хочу получить доступ к свойствам и классам, помеченным как internal
, Обычно это делается путем добавления атрибута InternalsVisibleAttribute к рассматриваемому проекту. Я попытался добавить csc.exe как сборку "друга", но у меня все еще есть проблемы с доступом.
- Это правильный подход для доступа к внутренним членам класса через интерактивную консоль C#?
- Если да, то какая 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# не сможет выполнить метод, если только он имеет доступ к этим сборкам и может их загружать.