Skip to content

HarmonyPatch 详解

[HarmonyPatch] 特性是声明补丁的入口。它有很多写法,本系列之前的章节只用到了最基础的一种。

声明目标类

csharp
// 对整个类补丁(类内所有标记的方法)
[HarmonyPatch(typeof(SomeGameClass))]
public static class SomeClass_Patches
{
    [HarmonyPatch(nameof(SomeGameClass.MethodA))]
    public static void PrefixA() { /* ... */ }

    [HarmonyPatch(nameof(SomeGameClass.MethodB))]
    public static void PrefixB() { /* ... */ }
}

补丁类上的 [HarmonyPatch(typeof(X))] 只是「默认目标」,方法级 [HarmonyPatch] 指定具体方法。

指定方法

csharp
// 方法名
[HarmonyPatch(typeof(SomeGameClass), nameof(SomeGameClass.SomeMethod))]

// 字符串形式(不推荐,重构易失效)
[HarmonyPatch(typeof(SomeGameClass), "SomeMethod")]

指定重载(参数类型)

游戏里常有同名重载,需要指定参数类型:

csharp
// 只补丁 void SomeMethod(int)
[HarmonyPatch(typeof(SomeGameClass), nameof(SomeGameClass.SomeMethod),
    new Type[] { typeof(int) })]

// 补充:new Type[0] 表示无参重载
[HarmonyPatch(typeof(SomeGameClass), nameof(SomeGameClass.SomeMethod),
    new Type[0])]

补丁构造函数

csharp
[HarmonyPatch(typeof(SomeGameClass), MethodType.Constructor)]
public static class Ctor_Patches
{
    public static void Postfix(SomeGameClass __instance)
    {
        // 构造完成后执行
    }
}

MethodType.Constructor 补丁构造函数。带参数的构造函数需同时指定参数类型。

补丁属性(getter / setter)

csharp
[HarmonyPatch(typeof(SomeGameClass), "SomeProperty", MethodType.Getter)]
public static class Getter_Postfix
{
    public static void Postfix(ref int __result) { /* ... */ }
}

[HarmonyPatch(typeof(SomeGameClass), "SomeProperty", MethodType.Setter)]
public static class Setter_Prefix
{
    public static void Prefix(int value) { /* ... */ }
}

优先级与执行顺序

csharp
[HarmonyPatch(typeof(SomeGameClass), nameof(SomeGameClass.SomeMethod))]
[HarmonyPriority(Priority.First)]
public static class Early_Prefix { /* ... */ }
  • Priority.High / Normal / Low / First / Last
  • 同优先级按类声明顺序

显式声明补丁类型

补丁方法名决定类型(Prefix / Postfix / Finalizer / Transpiler)。也可以改成任何名字并显式标注:

csharp
[HarmonyPatch(typeof(SomeGameClass), nameof(SomeGameClass.SomeMethod))]
public static class MyPatch
{
    [HarmonyPrefix]
    public static void Before() { /* 相当于 Prefix */ }
}

一个补丁类内可以有多个不同方法,分别用 [HarmonyPrefix] / [HarmonyPostfix] / [HarmonyFinalizer] / [HarmonyTranspiler] 标注。

在运行时选择目标

[HarmonyPatch] 只适合静态目标。动态目标用手动补丁(见 手动补丁)。

你学到了什么

  • [HarmonyPatch] 的多种目标写法:方法、重载、构造函数、属性
  • 类级 + 方法级补丁的组合
  • [HarmonyPriority] 与显式补丁类型标注

下一步

了解补丁的应用与移除机制 → 补丁生命周期

An organization that researches and expands the functions of ADOFAI