C#-使用Harmony库实现DLL文件反射调用

embedded/2024/9/24 0:20:56/

一. Harmony工作原理

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

二. Harmony下载及安装

     1.下载Harmony_lib库lib.harmony.2.3.3.nupkg

霸王•吕布 / CSharpHarmonyLib · GitCodeicon-default.png?t=N7T8https://gitcode.net/qq_35829452/csharpharmonylib     2.csproj添加reference引用

<Reference Include="0Harmony"><HintPath>..\..\Tool\C#\lib.harmony.2.3.3\lib\net48\0Harmony.dll</HintPath>
</Reference>

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

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

三. Harmony前置插桩,后置插桩

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

[HarmonyPatch(typeof(OriginalClass), "OriginalMethod")]
public class MyHarmonyPatch
{__instance获取类实例,___a获取实例变量public static bool Prefix(int ___a, string ___c, OriginalClass __instance){// 在这里编写补丁的逻辑Console.WriteLine("Patched method called!");Console.WriteLine(___c);return true; // 返回false将阻止原方法执行}public static bool Postfix(string ___c){// 在这里编写补丁的逻辑Console.WriteLine("Patched method called!");Console.WriteLine(___c);return true; // 返回false将阻止原方法执行}
}public class OriginalClass
{int a = 10;int b = 20;string c = "abc";public void OriginalMethod(){Console.WriteLine("Original method called!");}public void OtherMethod(){Console.WriteLine("Other Method called!");}
}

四. Traverse访问私有属性&私有方法

#访问私有属性
OriginalClass originalClass = new OriginalClass();
string value = Traverse.Create(originalClass).Field("a").GetValue<int>() + "a";
Console.WriteLine(value);#访问私有方法Method("12")
OriginalClass originalClass = new OriginalClass();
bool methodExisits = Traverse.Create(originalClass).Method("12").MethodExists();
Console.WriteLine(methodExisits);

     

五. AccessTool

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

#AccessTool反射调用目标dll方法
MethodInfo method = AccessTools.Method(typeof(OriginalClass), "OtherMethod");
method.Invoke(__instance, new object[0]);#AccessTool反射调用目标dll属性字段
FieldInfo info = AccessTools.Field(typeof(OriginalClass), "b");
Console.WriteLine(info.GetValue(__instance));


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

相关文章

华硕电脑怎么恢复删除的文件?有5种可以选择的方案

在日常使用华硕电脑的过程中&#xff0c;我们难免会遇到误删重要文件的情况。无论是因为不小心按错了键&#xff0c;还是由于某种软件故障&#xff0c;失去这些文件都可能会给我们带来不小的麻烦。那么&#xff0c;面对这样的情况&#xff0c;我们该如何有效地恢复这些被删除的…

百度文心一言:官方开放API开发基础

目录 一、模型介绍 1.1主要预置模型介绍 1.2 计费单价 二、前置条件 2.1 创建应用获取 Access Key 与 Secret Key 2.2 设置Access Key 与 Secret Key 三、基于千帆SDK开发 3.1 Maven引入SDK 3.2 代码实现 3.3 运行代码 一、模型介绍 文心一言&#xff08;英文名&…

Codeforces Round 816 (Div. 2)(D拆位图论构造 E斜率优化)

C&#xff1a;直接单独算每个位置的贡献&#xff0c;如果当前位置和前面位置重复了&#xff0c;那么前面就没选的位置了 修改的时候只要重新算i和i1位置即可 #include<bits/stdc.h> using namespace std; const int N3e510,M2*N,mod1e97; #define int long long #defin…

echarts之事件交互

ECharts 是一个优秀的开源可视化库&#xff0c;支持丰富的图表类型和交互功能。其中&#xff0c;事件交互是 ECharts 中非常重要的一部分&#xff0c;可以实现用户与图表的互动&#xff0c;比如点击、鼠标悬停等操作。下面我将为你介绍如何在 ECharts 中实现事件交互&#xff0…

阿里开源黑白图片上色算法DDColor的部署与测试并将模型转onnx后用c++推理

阿里开源黑白图片上色算法DDColor的部署与测试并将模型转onnx后用c推理 文章目录 阿里开源黑白图片上色算法DDColor的部署与测试并将模型转onnx后用c推理简介环境部署下载源码安装环境下载模型 测试一下看看效果模型转onnx测试一下生成的onnx模型看看效果C 推理 简介 DDColor是…

jmeter--取样器-- HTTP请求

HTTP请求&#xff08;HTTP Request&#xff09; 右键 >>> 添加 >>> 取样器 >>> HTTP请求&#xff08;HTTP Request&#xff09;基本web服务器协议&#xff1a;https服务器名称或IP&#xff1a;端口号&#xff1a;443HTTP请求请求方式&#xff1a;路…

STC12C5A60S2单片机学习DAY.5 单片机寻址方式与指令

一、寻址方式 1、立即寻址 直接给出参与运算的操作数&#xff0c;不管此数字存放在哪个地址 如MOV A,#70H&#xff0c;即为将70H放入累加器A中 2、直接寻址 指令操作数域是参与运算的数的地址 如ANL 70H,#42H 表示地址为70H的数与立即数42H相与&#xff0c;得到的结果存…

VMware 15 安装centos7虚拟机

1. 安装前准备 1.1 下载centos 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载需要版本的centos版本 直达链接 centos7.9 &#xff1a; centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 .基础使用的话安装选择这个就行了&#xff0c;大概下载几分钟 2. …