Возникла необходимость при помощи Reflection вызвать метод из класса "<Module>".
Как ни пытался, мне не удалось его найти
Пробовал искать путём перебора всех методов.
При помощи Mono.Cecil находится без проблем.
Можно как нибудь решить этот вопрос ?
Любыми способами(можно не при помощи Reflection), за исключением способов, предполагающих изменение сборки.
... << RSDN@Home 1.2.0 alpha 4 rev. 1091>>
T>Возникла необходимость при помощи Reflection вызвать метод из класса "<Module>".
здесьАвтор(ы): Агуров П.В.
При написании программ особенно важно не тратить время на поиск стандартных решений, а сосредоточиться на решении конкретной задачи, используя готовый эффективный код, разработанный и проверенный коллегой-программистом. В этой книге собраны лучшие рецепты и решения, которые пригодятся вам при разработке программ любой сложности и помогут создать действительно качественный и быстрый код. Вам не потребуется читать множество документации — ведь можно просто взять готовый пример. Книга будет полезна как разработчикам программ на С#, так и тем, кто переходит на язык С# с других языков программирования.
На компакт-диске размещены все исходные коды, приведенные в книге.
Вызвать метод по имени можно с помощью отражения (листинг 18). Можно даже вызвать private метод, указав соответствующие флаги поиска:
Type someType = someInstance.GetType();
MethodInfo mi = someType.GetMethod(
"System.Windows.Forms.ISomeInterface.SomeMethod",
BindingFlags.NonPublic | BindingFlags.Instance
);
if(mi != null)
{
mi.Invoke(someInsance, new object[]{});
}
Листинг 18. Вызов метода по имени
using System;
using System.Reflection;
namespace FindMethod
{
class Test
{
string name;
Test (string name)
{
this.name = name;
}
public void ShowName()
{
Console.WriteLine(name);
}
static void Main()
{
// Создать экземпляр объекта
Test t = new Test ("The name");
// Получить метод, который хотим вызвать
MethodInfo mi = typeof(Test).GetMethod("ShowName");
// Вызвать
mi.Invoke (t, null);
}
}
}
Здравствуйте, Pavel_Agurov, Вы писали:
P_A>Вызвать метод по имени можно с помощью отражения (листинг 18). Можно даже вызвать private метод, указав соответствующие флаги поиска:
Я знаю как вызвать методы.
Проблема в том, что его сначала надо найти, а сделать это у меня не получается.
Не буду снова описывать проблему, прочитай первый пост ещё раз.
Добавлю лишь что класс "<Module>" это некий служебный класс.
... << RSDN@Home 1.2.0 alpha 4 rev. 1091>>
Здравствуйте, torquemada, Вы писали:
T>Возникла необходимость при помощи Reflection вызвать метод из класса "<Module>".
Для специального типа <Module> нет соответствующего объекта System.Type. Надо пользоваться объектом System.Reflection.Module.
Assembly.GetExecutingAssembly().ManifestModule.GetMethod(...).Invoke(...);
Здравствуйте, nikov, Вы писали:
T>>Возникла необходимость при помощи Reflection вызвать метод из класса "<Module>".
N>Для специального типа <Module> нет соответствующего объекта System.Type. Надо пользоваться объектом System.Reflection.Module.
N>N>Assembly.GetExecutingAssembly().ManifestModule.GetMethod(...).Invoke(...);
N>
Фокус не удался.
Привожу конкретный пример.
Берёте любую обфусцированную дотфускатором сборку(например Reflector), в ней должен быть метод "<Module>.a"
Этот статический метод раскодирует строки, закодированные дотфускатором.
вот его то мне и надо выполнить.
В "полуавтоматическом" режиме я проблему решил, хотелось бы добиться полного автомата.
Здравствуйте, torquemada, Вы писали:
T>Берёте любую обфусцированную дотфускатором сборку(например Reflector), в ней должен быть метод "<Module>.a"
T>Этот статический метод раскодирует строки, закодированные дотфускатором.
T>вот его то мне и надо выполнить.
А в чем проблема?
using System;
using System.Reflection;
class Program
{
static void Main()
{
var reflector = Assembly.LoadFrom(@"E:\Reflector\Reflector.exe");
var methods = reflector.ManifestModule.GetMethods(BindingFlags.NonPublic | BindingFlags.Static);
var a = methods[0];
var result = a.Invoke(null, new object[] { "...", 0 });
Console.WriteLine(result);
}
}
Здравствуйте, nikov, Вы писали:
N>А в чем проблема?
N>N> var reflector = Assembly.LoadFrom(@"E:\Reflector\Reflector.exe");
N> var methods = reflector.ManifestModule.GetMethods(BindingFlags.NonPublic | BindingFlags.Static);
N> var a = methods[0];
N>
Спасибо, то, что надо.
... << RSDN@Home 1.2.0 alpha 4 rev. 1091>>