如何用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
相关产品推荐
相关产品推荐

