tuyoogame / huatuo

huatuo是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案。 Huatuo is a fully featured, zero-cost, high-performance, low-memory solution for Unity's all-platform native c# hotfix
MIT License
2.31k stars 377 forks source link

使用全热更状态下的ETTask测试异常 #12

Closed ChocolSauerkraut closed 2 years ago

ChocolSauerkraut commented 2 years ago

将ETTask全放入到热更程序集种,使用如下代码测试,工作异常

        public static void Start()
        {
            AsyncMethod().Coroutine();
        }

        static async ETTask AsyncMethod()
        {
            Debug.Log("Begin");
            await ETTask.CompletedTask;
            Debug.Log("End");
        }

注释掉Coroutine方法中的InnerCoroutine调用后可正常工作

        [DebuggerHidden]
        private async ETVoid InnerCoroutine()
        {
            await this;
        }

        [DebuggerHidden]
        public void Coroutine()
        {
            InnerCoroutine().Coroutine();
        }

经打断点调试发现是libil2cpp\huatuo\transform.cpp 3895行的断言引起的,此时size为24,GetTypeValueSize得到的size为8 初步怀疑是是由C#方法InnerCoroutine引起的该方法await的是一个ETTask返回的是一个async ETvoid

    PopStack();
    PushStackByType(&objKlass->byval_arg);
    IL2CPP_ASSERT(size == GetTypeValueSize(&objKlass->byval_arg));
    InsertMemoryBarrier();
    ResetPrefixFlags();
    ip += 5;
    continue;

ETTask的源码文件地址https://github.com/egametang/ET/tree/master/Unity/Assets/ThirdParty/ETTask 将整个ETTask文件夹放入热更程序集复制上述代码RefTypes中加入Queue泛型(印象中示例工程没加Queue)即可测试。

pirunxi commented 2 years ago

确认bug。已修复,稍后提交。