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

aku*_*aku 12 .net wpf code-injection

这是我的任务:

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

当我说"最好"时,我的意思是:

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

最小的用例

  • 选择运行WPF程序
  • 注入自定义代码
  • 注入代码将目标进程主窗口的标题更改为"Code Injected"

我正在评估的解决方案:

1)通过窗口挂钩注入(如在Snoop中)

优点:

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

缺点:

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

2)通过EasyHook库注入

优点:

  • 库看起来坚固且经过充分测试

缺点:

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

3)通过WriteProcessMemory/CreateRemoteThreadEx/LoadLibrary注入

优点:

  • 简单

缺点:

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

我将使用方法#1.你能推荐一个更好的方法吗?

在非托管DLL中是否有基于CLR托管的体面技术?

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

Tra*_*ton 2

由于用户对近 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/