Лучший способ внедрить ваш код в работающее приложение WPF - PullRequest
12 голосов
/ 25 января 2009

Вот моя задача:

  • Вставка настраиваемого управляемого кода в запуск управляемого приложения WPF (т.е. мой код должен запускаться в другом домене приложения)
  • Внедренный код должен быть выполнен в пользовательском интерфейсе нить

Когда я говорю «лучший», я имею в виду, что:

  • Процесс впрыска должен быть максимально стабильным по возможности (без блокировок ниток, и др.)
  • Код должен работать на x86 и x64 платформы без проблем (особенно на Vista x64)

Минимальный вариант использования

  • выбрать запущенную программу WPF
  • ввести пользовательский код
  • код ввода изменяет название основного окно целевого процесса в «Код» Введенный "

Решения, которые я оцениваю:

1) Инъекция через оконные хуки (как в Snoop )

плюсы:

  • внедренный код выполняется в потоке пользовательского интерфейса

минусы:

  • требуется смешанный (c ++ / cli) внешний dll
  • трудно отлаживать

2) Инъекция через EasyHook Библиотека

плюсы:

  • библиотека выглядит солидно и хорошо проверено

минусы:

  • не нашел способа запустить код в пользовательском интерфейсе нить
  • библиотека инъекций должна быть подписана и установлен в GAC

3) Инъекция через WriteProcessMemory / CreateRemoteThreadEx / LoadLibrary

плюсы:

  • простой

минусы:

  • очень нестабильный (код должен быть выполнен в DllMain, требуется CLR хостинг, и т.д.)

Я собираюсь использовать метод № 1. Можете ли вы порекомендовать лучший подход?

Существуют ли приличные методы, основанные на хостинге CLR в неуправляемых DLL-библиотеках?

Обратите внимание, что мне известны следующие вопросы:

Ответы [ 2 ]

2 голосов
/ 04 апреля 2018

В моем старом проекте я использовал CECIL (сделано для моно), что позволяет мне вставлять код отслеживания производительности в любой код. Образец слишком велик, чтобы вставить его сюда, но взгляните на проект ReflectionStudio и особенно этот класс инжекторов -. Он всегда доступен на веб-сайте mono / cecil - единственное, что нужно сделать, это позаботиться о вашем запросе об основной ветке пользовательского интерфейса.

2 голосов
/ 03 апреля 2018

Поскольку пользователь назначил открытую награду за вопрос, поставленный почти 9 лет назад, я добавлю обновленную опцию, которую я использовал для аналогичного проекта:

Платформа Prism для WPF очень хорошо документирована и надежна. Теперь я не уверен, что это совместимость с Vista (первоначальный запрос 9 лет назад), и я не уверен, что это важно больше. Он содержит очень похожую на MEF функцию в своем классе начальной загрузки, так что вы динамически загружаете то, что они называют библиотеками классов модулей (на самом деле это просто контейнеры XAML).

Таким образом, вы создаете библиотеки классов модулей и во время выполнения оболочки WPF сканирует каталог модулей в вашем приложении-контейнере для любых сборок модулей и динамически загружаются через каталог модулей (метод загрузчика Unity) в контейнер хоста через заранее определенные регионы. (звучит действительно MEF как да?)

Теперь Брайан Лагунас (http://brianlagunas.com)) опубликовал пример, который продвигает этот шаг дальше. Его реализация каталога модулей постоянно сканирует каталог, так что при добавлении DLL (во время выполнения оболочки) он выбирает файлы и обрабатывает их что фактически дает вам возможность добавлять управляемый код на лету. Добавьте кнопку загрузки в оболочку WPF, которая указывает на каталог модулей и использует агрегатор событий Prism, и вы можете переворачивать основной заголовок оболочки при каждой загрузке нового модуля. в.

Вот ссылка на пост Брайана, в котором обсуждается загрузка модулей во время выполнения: http://brianlagunas.com/prism-dynamically-discover-and-load-modules-at-runtime/

Ссылка на пример GitHub: https://github.com/brianlagunas/DynamicallyDiscover-LoadModules/

Если вы никогда не пользовались Призмой, то настоятельно рекомендуем вам посмотреть видео об ускоренном курсе Брайана. Это займет около 120 минут и поможет вам быстро начать работу с Prism, хотя версия немного устарела. http://brianlagunas.com/infragistics-webinar-mvvm-made-simple-with-prism-sample-code/

...