Ogoun
@Ogoun
Programmer

Инъекция кода в .NET?

Задача такая:


Есть сборка в которой происходит загрузка сторонних сборок (подгружаются ClickOnce приложения с удаленного сервера).

Далее хочу найти все окна загружаемой сборки(это сделано), найти у них метод Activate(тоже), и сделать инъекцию своего кода для перехвата создания окна.

Причем требуется сделать так, чтобы инъецируемый код обращался к методу основной сборки.


Нашел как сделать через Mono.Cecil, но хочу реализовать только средствами Framework'а.


Вот пример кода:
private static void InjectWindow(Assembly app)
    {
      Type[] types = app.GetTypes();
      foreach (Type type in types)
      {
        //Если базовый тип выбранного типа - Окно, инъекцируем
        if (type.BaseType.Name.Equals("Window", StringComparison.OrdinalIgnoreCase))
        {
            MethodInfo activate = type.GetMethod("Activate");
            //Теперь надо как-то дописать свой код
        }
      }
    }



В mono на этом этапе уже можно вызвать

activate.Body.Instructions.Insert(0, Instruction.Create(OpCodes.Ldstr, «Inject!»));


Как сделать без него?
  • Вопрос задан
  • 3225 просмотров
Пригласить эксперта
Ответы на вопрос 1
Malenkov
@Malenkov
Я так понимаю что вы не публичное приложение пишете, так что
1. Берём исходники Mono.Cecil
2. Убиваем ссылку на сборку из вашего проекта, подкладываем классы из Mono.Cecil пока код снова не заработает
3. Удаляем из добавленных классов всё лишнее (то что вами не используется)
4. ?????
5. PROFIT

Вполне себе codeproject-подход.

Ещё вот здесь есть небольшой обзор альтернатив Mono.Cecil, и там же говорится о том что ручные манипуляции это дело неблагодарное. Однострочного решения скорее всего нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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