【问题标题】:Best way to inject your code into running WPF application将代码注入正在运行的 WPF 应用程序的最佳方法
【发布时间】:2009-01-25 09:47:19
【问题描述】:

这是我的任务:

  • 将自定义托管代码注入 运行托管 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 中的体面技术?

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

【问题讨论】:

  • 这是怎么回事? Option 有什么缺点吗?

标签: .net wpf code-injection


【解决方案1】:

在我的旧项目中,我使用了 CECIL(为单声道完成),它允许我在任何代码中注入性能跟踪代码。示例太大,无法在此处粘贴,但请查看项目 ReflectionStudio,尤其是 this injector class - 。它始终在mono/cecil web site 上可用 - 唯一要做的就是处理您对主 UI 线程的请求。

【讨论】:

    【解决方案2】:

    自从用户对近 9 年前提出的问题提出公开赏金以来,我将提供一个我用于类似项目的更新选项:

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

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

    现在,Brian Lagunas (http://brianlagunas.com) 发布了一个示例,让这更进一步。他的模块目录实现持续扫描目录,以便在添加 dll 时(在 shell 运行时)它会拾取文件并处理它们,这实际上使您能够动态添加托管代码。将上传按钮添加到指向模块目录并利用 Prism 的事件聚合器的 WPF shell 中,您可以在加载新模块时翻转 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/

    【讨论】:

    • 那么对我的回答质量有异议吗?棱镜作为解决方案?还是有更好的?我也是来这里学习的,所以某种解释会很可爱。
    • 我猜投反对票的原因是您没有回答问题。问题在于将自定义代码注入到任何正在运行的 WPF 应用程序中,而不仅仅是 PRISM WPF 应用程序。
    • @VojtěchDohnal prism 是一个 wpf 框架,它允许您将托管代码注入正在运行的 wpf 应用程序中,特别是如问题所述获得对 UI 线程的访问权限。我猜我的答案不是直截了当而且不清楚,所以我会找一些时间来清理它以便更好地理解。感谢您抽出宝贵时间进行评论。
    • @Travis Acton,您提供的示例完全符合 Vojtěch Dohnal 所说的 - 将代码注入使用注入支持代码构建的 WPF 应用程序。它不能用于将代码注入任何第三方 WPF 应用程序。
    • @nicolay.anykienko 没有在要求中说明他正在尝试将代码注入第三方应用程序。他简单地指出,正在运行的主机应用程序可以位于不同的域上,这只是推断主机和注入代码之间的交互不能依赖于域。
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 2010-09-07
    • 2020-03-25
    • 2011-11-30
    • 2018-04-06
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多