12

这是我的任务:

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

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

  • 注入过程必须尽可能稳定(无线程死锁等)
  • 代码应该可以毫无问题地在 x86 和 x64 平台上运行(尤其是在 Vista x64 上)

最小用例

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

我正在评估的解决方案:

1) 通过 windows hooks 注入(如在Snoop中)

优点:

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

缺点:

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

2) 通过EasyHook库注入

优点:

  • 库看起来很稳固且经过良好测试

缺点:

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

3) 通过 WriteProcessMemory/CreateRemoteThreadEx/LoadLibrary 注入

优点:

  • 简单的

缺点:

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

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

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

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

4

2 回答 2

2

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

于 2018-04-04T06:46:03.237 回答
2

由于用户在将近 9 年前提出的问题上悬赏,我将提供一个我用于类似项目的更新选项:

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

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

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

这是 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/

于 2018-04-03T17:01:38.097 回答