Найти метод при помощи Reflection
От: torquemada  
Дата: 24.06.08 11:20
Оценка:
Возникла необходимость при помощи Reflection вызвать метод из класса "<Module>".
Как ни пытался, мне не удалось его найти
Пробовал искать путём перебора всех методов.
При помощи Mono.Cecil находится без проблем.

Можно как нибудь решить этот вопрос ?
Любыми способами(можно не при помощи Reflection), за исключением способов, предполагающих изменение сборки.
... << RSDN@Home 1.2.0 alpha 4 rev. 1091>>
Re: Найти метод при помощи Reflection
От: Pavel_Agurov Россия  
Дата: 24.06.08 11:26
Оценка:
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);
    }
  }
}
Re[2]: Найти метод при помощи Reflection
От: torquemada  
Дата: 24.06.08 12:36
Оценка:
Здравствуйте, Pavel_Agurov, Вы писали:

P_A>Вызвать метод по имени можно с помощью отражения (листинг 18). Можно даже вызвать private метод, указав соответствующие флаги поиска:


Я знаю как вызвать методы.
Проблема в том, что его сначала надо найти, а сделать это у меня не получается.
Не буду снова описывать проблему, прочитай первый пост ещё раз.
Добавлю лишь что класс "<Module>" это некий служебный класс.
... << RSDN@Home 1.2.0 alpha 4 rev. 1091>>
Re: Найти метод при помощи Reflection
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.06.08 13:19
Оценка:
Здравствуйте, torquemada, Вы писали:

T>Возникла необходимость при помощи Reflection вызвать метод из класса "<Module>".


Для специального типа <Module> нет соответствующего объекта System.Type. Надо пользоваться объектом System.Reflection.Module.

Assembly.GetExecutingAssembly().ManifestModule.GetMethod(...).Invoke(...);
Re[2]: Найти метод при помощи Reflection
От: torquemada  
Дата: 25.06.08 09:57
Оценка:
Здравствуйте, nikov, Вы писали:

T>>Возникла необходимость при помощи Reflection вызвать метод из класса "<Module>".

N>Для специального типа <Module> нет соответствующего объекта System.Type. Надо пользоваться объектом System.Reflection.Module.
N>
N>Assembly.GetExecutingAssembly().ManifestModule.GetMethod(...).Invoke(...);
N>


Фокус не удался.
Привожу конкретный пример.
Берёте любую обфусцированную дотфускатором сборку(например Reflector), в ней должен быть метод "<Module>.a"
Этот статический метод раскодирует строки, закодированные дотфускатором.
вот его то мне и надо выполнить.
В "полуавтоматическом" режиме я проблему решил, хотелось бы добиться полного автомата.
Re[3]: Найти метод при помощи Reflection
От: nikov США http://www.linkedin.com/in/nikov
Дата: 25.06.08 10:27
Оценка:
Здравствуйте, 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);
    }
}
Re[4]: Найти метод при помощи Reflection
От: torquemada  
Дата: 25.06.08 11:22
Оценка:
Здравствуйте, 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.