Вопрос по c#, .net, reflection – Вызов функции внутри внутреннего класса из другого исполняемого файла

7

Я хочу вызвать функцию из исполняемого файла .net из моего собственного кода. Я использовал отражатель и увидел это:

namespace TheExe.Core
{
    internal static class AssemblyInfo
    internal static class StringExtensionMethods
}

В пространстве имен TheExe.Core - это интересующая меня функция:

internal static class StringExtensionMethods
{
    // Methods
    public static string Hash(this string original, string password);
    // More methods...
}

Используя этот код, я вижу метод Hash, но как мне его назвать?

Assembly ass = Assembly.LoadFile("TheExe");
Type asmType = ass.GetType("TheExe.Core.StringExtensionMethods");
MethodInfo mi = asmType.GetMethod("Hash", BindingFlags.Public | BindingFlags.Static);
string[] parameters = { "blabla", "MyPassword" };

// This line gives System.Reflection.TargetParameterCountException
// and how to cast the result to string ?
mi.Invoke(null, new Object[] {parameters});
AFAIK, тоinternal намерение модификатора доступа заключается в следующем: не дать вам сделать это. знак равно Andre Calil
@ HillBilly.Developer Да, вы можете. Методы расширения по-прежнему являются обычными статическими методами и могут вызываться с использованием обычного синтаксиса. Синтаксис метода расширения является необязательным и аддитивным. Servy

Ваш Ответ

2   ответа
9

Вы передаете массив строк как один параметр с вашим текущим кодом.

посколькуstring[] может быть принужден кobject[]Вы можете просто передатьparameters массив вInvoke.

string result = (string)mi.Invoke(null, parameters);
Полезно знать, спасибо. У вас есть какие-либо ссылки на это?
Вы уверены, что это будет работать? Этот классinternal
@AndreCalil, да - вы можете вызывать что угодно (включая приватные методы с аргументами в качестве приватных классов) через рефлексию. (Предполагая, что Ремко получил правильную информацию об объекте / методе).
Да, только что проверил и все работает! (приму ответ) Remko
@AndreCalil Если это не приложение для метро, да, вы можете позвонитьinternal или жеprivate классы и методы через рефлексию. Модификаторы доступа не являются мерой безопасности.
3

Если вам это нужно для целей тестирования, рассмотрите возможность использования атрибута InternalsVisibleTo. Таким образом, вы можете сделать свою тестовую сборку «другом» основной сборки и вызова внутренних методов / классов.

Если вы не имеете контрольных (или не можете подписывать) сборок - рефлексия - это способ сделать это, если вам нужно. Вызов внутренних методов сторонних сборок - хороший способ получить головную боль, когда эта сборка изменяется в любой форме.

Да, я знаю об этом риске, но он приемлем для моего использования (+1) Remko

Похожие вопросы