InjectFix icon indicating copy to clipboard operation
InjectFix copied to clipboard

对override void OnDestroy()打补丁,base.OnDestroy会调用到自身的OnDestroy,报StackOverflowException

Open jinghuafumen opened this issue 5 years ago • 6 comments

对override void OnDestroy()打补丁,base.OnDestroy会调用到自身的OnDestroy,报StackOverflowException

protected override void OnDestroy()
{
    base.OnDestroy();
    ...
}

jinghuafumen avatar Jan 11 '21 13:01 jinghuafumen

public class Test_Base : MonoBehaviour { protected virtual void OnDestroy() {

}

}

public class Test : Test_Base { [IFix.Patch] protected override void OnDestroy() { base.OnDestroy(); } }

测试发现,Test_Base 和 Test 如果在同一个程序集就没问题,如果Test_Base 是在另一个dll中,运行就会闪退。

jinghuafumen avatar Jan 20 '21 04:01 jinghuafumen

一种暂时测试可行的解决方法: InjectFix源码中: Dictionary<MethodReference, Dictionary<TypeDefinition, MethodReference>> baseProxys = new Dictionary<MethodReference, Dictionary<TypeDefinition, MethodReference>>(); 改成-》 Dictionary<string, Dictionary<TypeDefinition, MethodReference>> baseProxys = new Dictionary<string, Dictionary<TypeDefinition, MethodReference>>();

即将key从MethodReference换成string,比如可以用方法的fullname做key就能解决这个bug了,调试发现如果用MethodReference做key,如果base 方法在不同程序集中会有问题

alover avatar Jun 03 '21 03:06 alover

只有继承的是另外一个程序集才会这样。这个设定是来自xlua的实践,一开始xlua并没这限制,但发现继承另外一个程序集时,注入后会导致il2cpp转换的过程中崩溃。所以做了这么个限制,而ifix开发时也继承了这么个限制。

chexiongsheng avatar Jun 03 '21 11:06 chexiongsheng

只有继承的是另外一个程序集才会这样。这个设定是来自xlua的实践,一开始xlua并没这限制,但发现继承另外一个程序集时,注入后会导致il2cpp转换的过程中崩溃。所以做了这么个限制,而ifix开发时也继承了这么个限制。

你好,那这个限制会导致patch代码运行后堆栈溢出不是也有问题么,我上面说的那个修复方式可行吗,会不会带来其他问题

alover avatar Jun 03 '21 13:06 alover

只有继承的是另外一个程序集才会这样。这个设定是来自xlua的实践,一开始xlua并没这限制,但发现继承另外一个程序集时,注入后会导致il2cpp转换的过程中崩溃。所以做了这么个限制,而ifix开发时也继承了这么个限制。

你好,那这个限制会导致patch代码运行后堆栈溢出不是也有问题么,我上面说的那个修复方式可行吗,会不会带来其他问题

出现这问题表示ifix应付不了这种bug。总比il2cpp出错,你直接打不了包好。 ifix是为了规避il2cpp出错而特意做的限制,并不是程序逻辑解决不了。你的“修复方式”只是放开了那限制。 另外,il2cpp出错只是某些unity版本的情况(直白点就是il2cpp的bug),只是为了统一,就全部加了限制。如果你放开了那限制在你的unity版本没导致il2cpp崩溃,就能用

chexiongsheng avatar Jun 04 '21 04:06 chexiongsheng

只有继承的是另外一个程序集才会这样。这个设定是来自xlua的实践,一开始xlua并没这限制,但发现继承另外一个程序集时,注入后会导致il2cpp转换的过程中崩溃。所以做了这么个限制,而ifix开发时也继承了这么个限制。

你好,那这个限制会导致patch代码运行后堆栈溢出不是也有问题么,我上面说的那个修复方式可行吗,会不会带来其他问题

出现这问题表示ifix应付不了这种bug。总比il2cpp出错,你直接打不了包好。 ifix是为了规避il2cpp出错而特意做的限制,并不是程序逻辑解决不了。你的“修复方式”只是放开了那限制。 另外,il2cpp出错只是某些unity版本的情况(直白点就是il2cpp的bug),只是为了统一,就全部加了限制。如果你放开了那限制在你的unity版本没导致il2cpp崩溃,就能用

好的,明白了,谢谢大佬解答!

alover avatar Jun 04 '21 06:06 alover