C#-使用Harmony库反射给DLL文件打Patch

embedded/2024/10/19 21:33:15/

一. Harmony工作原理

     利用C#运行时Runtime的反射机制,动态加载dll中的方法,字段,属性,实现对DLL方法的重写和代码注入。

二. Harmony下载及安装

     通过创建Harmony实例,调用PatchAll()方法实现补丁类的加载

#加载已经实现的补丁类,重写原有DLL中方法
var harmonyPatch = new Harmony("patch");
harmonyPatch.PatchAll();

三. Harmony前置注入,后置注入

     通过在类实例上添加Harmony注解,实现补丁类,添加Prefix,Postfix实现对调用方法前,调用方法后的重写,返回值true/false决定原DLL方法是否被执行。

[HarmonyPatch(typeof(OriginalClass), "OriginalMethod")]
public class MyHarmonyPatch
{public static bool Prefix(int ___a, string ___c){// 在这里编写补丁的逻辑Console.WriteLine("Patched method called!");Console.WriteLine(___c);return true; // 返回false将阻止原方法执行}public static bool Postfix(){// 在这里编写补丁的逻辑Console.WriteLine("Patched method called!");Console.WriteLine(___c);return true; // 返回false将阻止原方法执行}
}

四. Harmony获取类实例,私有属性

     方法中创建___instance实现对实例的获取,等效与this。

     方法中创建___a实现对实例属性的获取。

五. Harmony-AccessTool

     使用AccessTool对类进行反射,动态调用目标类的方法。


http://www.ppmy.cn/embedded/3903.html

相关文章

Linux之命令行参数的原理以及实现,环境变量限时增加删除和永久增加删除以及代码获取环境变量

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 一.命令行参数 1.1main函数参数 在我们学习c语言时我们的main函数…

ShardingSphere:强大的分布式数据库中间件【图文】

ShardingSphere的诞生 ShardingSphere的结构 Sharding-JDBC :它提供了一个轻量级的 Java 框架,在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动&…

在STM32中给固定的地址写入一个值,并通过memory窗口进行查看

首先对STM32中存储数据的地方有一个了解 一个是FLASH,一个是RAM RAM是易失存储器,FLASH是非易失存储器,这是最直观的解释。 主要记住以下几点: RAM(随机存储器):既可以从中读取数据,也可以写…

Java中的封装性与几种权限修饰符

Java中的封装性与几种权限修饰符 在Java编程中,封装性是一个核心概念,它涉及到将数据(变量)和对这些数据进行的操作(方法)绑定在一起,形成一个独立的单元。封装有助于隐藏对象的内部状态和实现…

sprinboot+vue集成neo4j图数据库

一 、java后台 1.1 package com.admin.domain;/*** 功能描述:** author wangwei* date 2024-01-15 22:13*/ public class ConnectWeb {private String connectWebId;private String connectWebName;private String connectWebInfo;private String personWebIdAlph…

【网络编程】如何创建一个自己的并发服务器?

hello !大家好呀! 欢迎大家来到我的网络编程系列之如何创建一个自己的并发服务器,在这篇文章中,你将会学习到在Linux内核中如何创建一个自己的并发服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家…

每日三个JAVA经典面试题(四十二)

1.Java中的线程池如何帮助优化性能? Java中的线程池是一种重要的并发编程工具,它可以帮助优化性能的方式有以下几点: 资源管理:线程池可以管理并重用线程,而不是为每个任务都创建一个新的线程。这减少了线程创建和销毁…

Vue.js------Vue组件基础

能够理解Vue组件概念和作用能够掌握封装创建组件能力能够使用组件之间通信能够完成todo案例 一.Vue组件创建和使用 1.折叠面板-实现多个 创建一个文件夹demo 具体步骤请参考vue.js---vue基础 ⚫ 解决方案: 采用vue提供的单.vue文件-组件方式来封装一套然后复用 在component…