Skip to content

Harmony 补丁 ​

SDK 已内置 HarmonyX 2.x。加载插件时,LoaderManager 会自动调用 HarmonyInstance.PatchAll(asm)——你只需在插件程序集内声明标准 Harmony 特性类即可生效,不用手写任何注入代码。

示例 1:方法执行前拦截(Prefix) ​

拦截或修改原版方法逻辑:

csharp
[HarmonyPatch(typeof(Tabbar_TabItem), "threadWorkForAutoSave")]
public static class Patch_DisableOfficialAutoSave
{
    // 返回 false 表示跳过原版方法执行
    public static bool Prefix()
    {
        return false;
    }
}

示例 2:方法执行后增强(Postfix) ​

csharp
[HarmonyPatch(typeof(BLStudio), "SaveModelToLocalFileSystem")]
public static class Patch_SaveModelNotification
{
    public static void Postfix(string path)
    {
        StudioAPI.ShowToast("已成功保存至: " + System.IO.Path.GetFileName(path));
    }
}

要点 ​

  • 补丁类放在插件程序集里即可,不需要手动调用 PatchAll。
  • HarmonyInstance 的 Identifier 是插件 Id,补丁归属清晰,卸载时可整体撤销。
  • Prefix 返回 false 会跳过原方法;需要读取/改写参数时用 ref 参数配合 __instance、___字段名 等 Harmony 注入变量。
  • 补丁目标类型来自 Studio 自身的程序集(Studio.dll、Studio.DataModel.dll 等),所以插件项目必须引用它们。
  • 打补丁失败会在加载阶段抛出,错误与堆栈会出现在 F10 控制台的「已加载插件」页。

排查补丁是否生效

F10 控制台的「已加载插件」页会显示每个插件生效的补丁数量。数量为 0 说明 PatchAll 没扫到任何补丁类——通常是特性写错或方法签名不匹配。

为 BrickLink Studio 2.0 打造的第三方 Mod 加载框架 · 与 BrickLink / LEGO 官方无关联