将代码注入正在运行的 WPF 应用程序的最佳方法

发布于 2024-07-12 19:26:35 字数 1349 浏览 6 评论 0原文

这是我的任务:

  • 将自定义托管代码注入 运行托管 WPF 应用程序(即我的代码应该在其他 AppDomain 中运行)
  • 注入的代码必须在 UI 上执行 当

我说“最好”时,我的意思是:

  • 注射过程必须稳定 尽可能(没有线程死锁, 等)
  • 代码应在 x86 和 x64 上运行 没有问题的平台(特别是 在 Vista x64 上)

最小用例

  • 选择运行 WPF 程序
  • 注入自定义代码
  • 注入代码更改主标题 目标进程的窗口到“代码 “注入”

我正在评估的

解决方案: 1)通过 Windows 挂钩注入(如 Snoop

优点:

  • 注入的代码运行在 UI 线程上

缺点:

  • 需要混合 (c++/cli) 外部 dll
  • 难以调试

2) 通过 EasyHook 库注入

优点:

  • 库看起来很可靠并且经过充分测试

缺点:

  • 没有找到在 UI 上运行代码的方法 线程
  • 注入库必须经过签名并且 安装在 GAC 中

3) 通过 WriteProcessMemory/CreateRemoteThreadEx/LoadLibrary 注入

优点:

  • 简单

缺点:

  • 非常不稳定(代码必须执行 在 DllMain 中,需要 CLR 托管, 等)

我将使用方法#1。 您能推荐更好的方法吗?

是否有任何基于 CLR 托管在非托管 DLL 中的不错的技术?

请注意,我知道这些问题:

Here is my task:

  • Inject custom managed code into
    running managed WPF application (i.e. my code should run in other AppDomain)
  • Injected code must be executed on UI
    thread

When I say 'best' I mean that:

  • Injection process must be as stable
    as possible (no thread deadlocks,
    etc.)
  • Code should run on x86 and x64
    platforms without problem (especially
    on Vista x64)

Minimal use-case

  • select running WPF program
  • inject custom code
  • inject code changes title of the main
    window of target process to "Code
    Injected"

Solutions I'm evaluating:

1) Injection via windows hooks (like in Snoop)

pros:

  • injected code runs on UI thread

cons:

  • requires mixed (c++/cli) external dll
  • hard to debug

2) Injection via EasyHook library

pros:

  • library looks solid and well-tested

cons:

  • didn't find a way to run code on UI
    thread
  • injection library must be signed and
    installed in GAC

3) Injection via WriteProcessMemory/CreateRemoteThreadEx/LoadLibrary

pros:

  • simple

cons:

  • very unstable (code must be executed
    in DllMain, CLR hosting required,
    etc)

I'm going to use method #1. Can you recommend a better approach?

Are there any decent techniques based on CLR hosting in unmanaged DLLs ?

Note, that I'm aware of these questions:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

久伴你 2024-07-19 19:26:47

由于用户对近 9 年前提出的问题进行了公开悬赏,因此我将提供一个我在类似项目中使用过的更新选项:

WPF 的 Prism 框架有很好的文档记录并且很可靠。 现在我不确定它是否与 Vista 兼容(最初的请求是 9 年前),我也不确定这是否不再重要。 它在其统一引导程序类中包含一个非常类似于 MEF 的函数,以便您动态加载它们所谓的模块类库(实际上只是 XAML 容器)。

因此,您构建模块类库,并在 WPF shell 运行时扫描容器应用程序中的模块目录以查找任何模块程序集,并通过模块目录(Unity Bootstrapper 的方法)通过预定区域动态加载到主机容器中。 (听起来确实像 MEF 吧?)

现在 Brian Lagunas (http://brianlagunas.com) 发布了一个示例,该示例采用这更进一步。 他的模块目录实现不断扫描目录,以便在添加 dll 时(在 shell 运行时期间)它会拾取文件并处理它们,这实际上使您能够动态添加托管代码。 向 WPF shell 添加一个上传按钮,该按钮指向模块目录并利用 Prism 的事件聚合器,每当加载新模块时,您都可以翻转 shell 的主标题。

以下是 Brian 讨论在运行时加载模块的帖子的链接:
http://brianlagunas.com/prism-dynamically-discover -and-load-modules-at-runtime/

链接到 GitHub 示例:
https://github.com/brianlagunas/DynamicallyDiscover-LoadModules/

如果您从未使用过那么 Prism 强烈建议您观看 Brian 的速成课程视频。 大约 120 分钟,即使版本稍微过时,也能让您快速掌握 Prism。
http://brianlagunas.com/infragistics-webinar -mvvm-made-simple-with-prism-sample-code/

Since a user put an open bounty on a question delivered nearly 9 years ago, I'll throw in an updated option I've used for a similar project:

The Prism framework for WPF is very well documented and solid. Now I'm not sure it's compatibility with Vista (original request 9 years ago) and I'm not sure that is important anymore. It contains a very MEF like function in its unity bootstrapper class such that you dynamically load what they call modules class libraries (which is really just XAML containers).

So you build out your module class libraries and at WPF shell runtime it scans your module directory in your container application for any of the module assemblies and dynamically loads via a module catalog (method of the Unity Bootstrapper) into the host container through predetermined regions. (sounds really MEF like huh?)

Now Brian Lagunas (http://brianlagunas.com) has an example posted that takes this a step further. His module catalog implementation continuously scans a directory so as dll's are added (during shell runtime) it picks the files up and processes them which in effect gives you the ability to add managed code on the fly. Add an upload button to the WPF shell that points to the module directory and utilizes Prism's Event Aggregator and you can flip the main title of the shell whenever a new module is loaded in.

Here is a link to Brian's post discussing loading modules at runtime:
http://brianlagunas.com/prism-dynamically-discover-and-load-modules-at-runtime/

Link to GitHub example:
https://github.com/brianlagunas/DynamicallyDiscover-LoadModules/

If you have never used Prism then highly suggest you watch Brian's crash course video. It is around 120 minutes and will get you going quickly with Prism even though the version is slightly outdated.
http://brianlagunas.com/infragistics-webinar-mvvm-made-simple-with-prism-sample-code/

命比纸薄 2024-07-19 19:26:44

在我的旧项目中,我使用了 CECIL(针对 mono 完成),它允许我在任何代码中注入性能跟踪代码。 示例太大,无法粘贴到此处,但请查看项目ReflectionStudio,尤其是此注入器类 - . 它始终可以在 mono/cecil 网站 - 唯一的事情是处理您关于主 UI 线程的请求。

on my old project, I was using CECIL (done for mono) which allow me to inject performance tracing code in any code. Sample is too big to be pasted here, but have a look to the project ReflectionStudio and especially this injector class - . It is allways available on mono/cecil web site - only thing is to take care of your request about the main UI thread.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文