代码之家  ›  专栏  ›  技术社区  ›  aku

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

  •  12
  • aku  · 技术社区  · 16 年前

    我的任务是:

    • 将自定义托管代码插入 运行托管wpf应用程序(即,我的代码应该在其他appdomain中运行)
    • 注入的代码必须在ui上执行 线

    我说“最好”是指:

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

    最小用例

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

    我正在评估的解决方案:

    1)通过窗口挂钩(如 Snoop )

    赞成的意见:

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

    欺骗:

    • 需要混合(C++/CLI)外部DLL
    • 难以调试

    2)通过 EasyHook 图书馆

    赞成的意见:

    • 图书馆看起来很坚固,而且经过了很好的测试

    欺骗:

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

    3)通过writeprocessmemory/createremotethreadex/loadlibrary注入

    赞成的意见:

    • 简单的

    欺骗:

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

    我要用方法1。你能推荐一种更好的方法吗?

    在非托管dll中是否有基于clr托管的合适技术?

    注意,我知道这些问题:

    2 回复  |  直到 7 年前
        1
  •  2
  •   GCamel    7 年前

    在我以前的项目中,我使用的是cecil(done for mono),它允许我在任何代码中注入性能跟踪代码。样本太大,无法粘贴在此处,但请查看项目 ReflectionStudio 尤其是 this injector class -它总是在 mono/cecil web site -唯一的事情是处理关于主ui线程的请求。

        2
  •  2
  •   Vijay S KernelPanik    7 年前

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

    用于wpf的prism框架有很好的文档和实体。现在我不确定它是否与vista(9年前的原始请求)兼容,我也不确定这是否重要了。它的unity bootstrapper类中包含一个非常类似mef的函数,因此可以动态加载它们所称的模块类库(实际上只是xaml容器)。

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

    现在布莱恩·拉古纳斯( http://brianlagunas.com )发布了一个示例,进一步说明了这一点。他的模块目录实现会连续扫描目录,以便在添加dll时(在shell运行时)提取文件并对其进行处理,这实际上使您能够动态添加托管代码。在wpf shell中添加一个upload按钮,该按钮指向模块目录并利用prism的事件聚合器,您可以在加载新模块时翻转shell的主标题。

    以下是Brian关于在运行时加载模块的文章的链接: http://brianlagunas.com/prism-dynamically-discover-and-load-modules-at-runtime/

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

    如果你从未使用过棱镜,那么强烈建议你看布莱恩的速成课程视频。这大约是120分钟,将使你快速与棱镜,即使版本稍显过时。 http://brianlagunas.com/infragistics-webinar-mvvm-made-simple-with-prism-sample-code/