You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Harmony修补序列化IEnumerable类中的私有方法?报错求助

问题分析与解决方案

错误原因

你编写的Postfix补丁与目标方法的签名完全不匹配:

  • 目标方法Class1.Method()是**无返回值(void)**的普通方法
  • 你的Postfix却返回IEnumerator并使用了yield return,这会让Harmony尝试将原方法改造成迭代器结构,导致IL代码生成错误,最终抛出InvalidProgramException。

正确补丁写法

场景1:仅在原方法执行后执行额外逻辑

如果只是需要在Method()执行完成后运行自定义代码,Postfix应保持与原方法一致的返回类型(void):

[HarmonyPostfix, HarmonyPatch(typeof(Class1), "Method")]
public static void PostPatch(Class1 __instance)
{
    // 此处编写原方法执行后需要执行的代码
}

场景2:误将原方法认作迭代器(目标方法实际返回IEnumerator)

如果你原本想patch的是一个返回IEnumerator的迭代器方法(可能看错了原方法签名),需先确认原方法定义为:

private IEnumerator Method()
{
    // ... 原迭代器逻辑
}

此时若要包装迭代器逻辑,可通过以下方式编写Postfix(注意需处理迭代器的枚举过程):

[HarmonyPostfix, HarmonyPatch(typeof(Class1), "Method")]
public static IEnumerator PostPatch(Class1 __instance, IEnumerator result)
{
    // 在原迭代器执行前插入逻辑
    yield return null;
    
    // 遍历原迭代器的所有元素
    while (result.MoveNext())
    {
        yield return result.Current;
        // 每次迭代后插入逻辑
    }
    
    // 在原迭代器执行完成后插入逻辑
}

额外注意事项

  • 目标方法是private访问级别,需确保补丁所在程序集能通过反射访问该方法(Harmony默认会处理私有成员的访问,但如果遇到权限问题,可改用AccessTools.Method(typeof(Class1), "Method")来指定目标方法)。

内容的提问来源于stack exchange,提问作者Daedra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:45:41