对override void OnDestroy()打补丁,base.OnDestroy会调用到自身的OnDestroy,报StackOverflowException
对override void OnDestroy()打补丁,base.OnDestroy会调用到自身的OnDestroy,报StackOverflowException
protected override void OnDestroy()
{
base.OnDestroy();
...
}
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中,运行就会闪退。
一种暂时测试可行的解决方法: 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 方法在不同程序集中会有问题
只有继承的是另外一个程序集才会这样。这个设定是来自xlua的实践,一开始xlua并没这限制,但发现继承另外一个程序集时,注入后会导致il2cpp转换的过程中崩溃。所以做了这么个限制,而ifix开发时也继承了这么个限制。
只有继承的是另外一个程序集才会这样。这个设定是来自xlua的实践,一开始xlua并没这限制,但发现继承另外一个程序集时,注入后会导致il2cpp转换的过程中崩溃。所以做了这么个限制,而ifix开发时也继承了这么个限制。
你好,那这个限制会导致patch代码运行后堆栈溢出不是也有问题么,我上面说的那个修复方式可行吗,会不会带来其他问题
只有继承的是另外一个程序集才会这样。这个设定是来自xlua的实践,一开始xlua并没这限制,但发现继承另外一个程序集时,注入后会导致il2cpp转换的过程中崩溃。所以做了这么个限制,而ifix开发时也继承了这么个限制。
你好,那这个限制会导致patch代码运行后堆栈溢出不是也有问题么,我上面说的那个修复方式可行吗,会不会带来其他问题
出现这问题表示ifix应付不了这种bug。总比il2cpp出错,你直接打不了包好。 ifix是为了规避il2cpp出错而特意做的限制,并不是程序逻辑解决不了。你的“修复方式”只是放开了那限制。 另外,il2cpp出错只是某些unity版本的情况(直白点就是il2cpp的bug),只是为了统一,就全部加了限制。如果你放开了那限制在你的unity版本没导致il2cpp崩溃,就能用
只有继承的是另外一个程序集才会这样。这个设定是来自xlua的实践,一开始xlua并没这限制,但发现继承另外一个程序集时,注入后会导致il2cpp转换的过程中崩溃。所以做了这么个限制,而ifix开发时也继承了这么个限制。
你好,那这个限制会导致patch代码运行后堆栈溢出不是也有问题么,我上面说的那个修复方式可行吗,会不会带来其他问题
出现这问题表示ifix应付不了这种bug。总比il2cpp出错,你直接打不了包好。 ifix是为了规避il2cpp出错而特意做的限制,并不是程序逻辑解决不了。你的“修复方式”只是放开了那限制。 另外,il2cpp出错只是某些unity版本的情况(直白点就是il2cpp的bug),只是为了统一,就全部加了限制。如果你放开了那限制在你的unity版本没导致il2cpp崩溃,就能用
好的,明白了,谢谢大佬解答!