DangoRyn / UnityGameFramework_HybridCLR

UnityGameFramework框架,目标整合HybridCLR和luban提供完整热更和配置表演示。
198 stars 36 forks source link

UnityGameFramework.Runtime.dll.bytes #3

Open MisterNatureQ opened 2 years ago

MisterNatureQ commented 2 years ago

windows 64位打包之后 huatuo 报错 ; ExecutionEngineException: metadata field not match 报错的是 UnityGameFramework.Runtime.dll.bytes; 注释掉 s_AotDllList 中的 "UnityGameFramework.Runtime" 后运行正常 ; 疑问 1 看代码 /{dll} 到 /{dll}.bytes 是不是仅仅只是 拷贝 并没有更改 2 LoadMetadataForAOTAssembly 没有理解这里的公用; 在这里注释掉 "UnityGameFramework.Runtime" 修改是不是有问题 和 作者本身的想法冲突了

MisterNatureQ commented 2 years ago

调整之后可以了

// 编译Dll private static void CompileDll(string buildDir, BuildTarget target) { var group = BuildPipeline.GetBuildTargetGroup(target);

        // ScriptCompilationSettings 如何构建脚本的信息
        // https://docs.unity3d.com/cn/2020.2/ScriptReference/Build.Player.ScriptCompilationSettings.html
        ScriptCompilationSettings scriptCompilationSettings = new ScriptCompilationSettings();
        // 编译脚本所针对的平台组
        scriptCompilationSettings.group = group;
        //  编译脚本所针对的平台组
        scriptCompilationSettings.target = target;
        // 编译脚本时要使用的特定编译器选项
        // 创建文件夹
        CreateDirIfNotExists(buildDir);

        // 将用户脚本编译为一个或多个程序集 返回 assemblies 编译后的程序集的集合 typeDB 由脚本编译调用生成的类型信息
        // [PlayerBuildInterface.CompilePlayerScripts](https://docs.unity3d.com/cn/current/ScriptReference/Build.Player.PlayerBuildInterface.CompilePlayerScripts.html)
        // [Unity 3d 编辑器程序集编译API - 笔记](https://www.jianshu.com/p/7ffca90fa853)
        ScriptCompilationResult scriptCompilationResult = PlayerBuildInterface.CompilePlayerScripts(scriptCompilationSettings, buildDir);

        // assemblies 编译后的程序集的集合
        // https://docs.unity3d.com/cn/current/ScriptReference/Build.Player.ScriptCompilationResult.html
        foreach (var ass in scriptCompilationResult.assemblies)
        {
            Debug.LogFormat($"CompileDll compile assemblies:{ass}; buildDir:{buildDir}; Application.dataPath{Application.dataPath}; group:{group}; BuildTarget:{target}; ");
        }

        // 需要热跟新Dll
        var hotfixDlls = new List<string>()
        {
            "Game.Hotfix.dll",
        };

        foreach(var dll in hotfixDlls)
        {
            string dllPath = $"{GetDllBuildOutputDirByTarget(target)}/{dll}";
            string dllBytesPath = $"{GetAssetBundleTempDirByTarget(target)}/{dll}.bytes";
            File.Copy(dllPath, dllBytesPath, true);
            Debug.LogFormat("hotfixDlls CompileDll :{0} dllBytesPath:{1}", dllPath, dllBytesPath);
        }

        ////////////////////////////////////////////////////////////////////////////////

        // 用于补充元数据的dll
        var aotDlls = new List<string>()
        {
            "mscorlib.dll",
            "System.dll",
            "System.Core.dll", // 如果使用了Linq,需要这个
            "LitJson.dll",// ok
            "protobuf-net.dll",// ok
            "GameFramework.dll",// error 
            "UnityGameFramework.Runtime.dll",// error
        };

        string aotDllDir = $"{AssembliesPostIl2CppStripDir}/{target}";
        foreach(var dll in aotDlls)
        {
            // 这个路径是错误的
            //string dllPath = $"{GetDllBuildOutputDirByTarget(target)}/{dll}";
            // 应该使用这个路径
            string dllPath = $"{aotDllDir}/{dll}";
            if(!File.Exists(dllPath))
            {
                // \HuatuoData\AssembliesPostIl2CppStrip\StandaloneWindows64 windows 目前看是在这个目录
                // \Temp\HuaTuo\build\StandaloneWindows64 这个目录下面是没有的
                Debug.LogError($"ab中添加AOT补充元数据dll:{dllPath} 时发生错误,文件不存在。需要构建一次主包后才能生成裁剪后的AOT dll");
                continue;
            }
            string dllBytesPath = $"{GetAssetBundleMetadataAssemblyAssetByTarget(target)}/{dll}.bytes";
            File.Copy(dllPath, dllBytesPath, true);
            Debug.LogFormat("metadata_hotfixDlls CompileDll :{0} dllBytesPath:{1}", dllPath, dllBytesPath);
        }

        AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
    }
DangoRyn commented 2 years ago

前两天没看到不好意思,dll不同会导致metadata无法匹配,原先是我已经编译好的放在上面的所以不会有异常。如果自行有修改就需要重新拷贝一份新的dll这里没有详细说明。很感谢你分享的修改的方案。

maki0315 commented 2 years ago

我也遇到过这个问题,我这里有个问题请教一下,关于补充元数据的dll UnityGameFramework.Runtime 我用于热更打包发布后使用是没有问题的,但后来我在 UnityGameFramework.Runtime 新增了方法,重新拷到要打的AB包里经行热更,用于补充元数据,运行后显示不匹配(metadata field not match ),不知道这个是什么原因, image