HotUpdateEntry.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using Assets.Game.Launcher.HotUpdateProxy;
  2. using ET;
  3. using FairyGUI;
  4. using System;
  5. using System.Collections.Generic;
  6. using UnityEngine;
  7. namespace GFGGame.HotUpdate
  8. {
  9. public class HotUpdateEntry
  10. {
  11. public static void Start()
  12. {
  13. Log.Debug("HotUpdateEntry Start 1");
  14. #if !UNITY_EDITOR
  15. LoadMetadataForAOTAssembly();
  16. #endif
  17. Log.Debug("HotUpdateEntry Start 2");
  18. VEngine.Logger.Loggable = false;
  19. //ET
  20. try
  21. {
  22. HotUpdateProxy.Instance.update = Game.Update;
  23. HotUpdateProxy.Instance.lateUpdate = Game.LateUpdate;
  24. HotUpdateProxy.Instance.onApplicationQuit = Game.Close;
  25. Game.EventSystem.Add(HotUpdateCodeLoader.Instance.GetTypes());
  26. Game.EventSystem.Publish(new ET.EventType.AppStart());
  27. }
  28. catch (Exception e)
  29. {
  30. Log.Error(e);
  31. }
  32. Log.Debug("HotUpdateEntry Start 3");
  33. GameController.Start();
  34. Log.Debug("HotUpdateEntry Start 4");
  35. }
  36. /// <summary>
  37. /// 为aot assembly加载原始metadata, 这个代码放aot或者热更新都行。
  38. /// 一旦加载后,如果AOT泛型函数对应native实现不存在,则自动替换为解释模式执行
  39. /// </summary>
  40. public static unsafe void LoadMetadataForAOTAssembly()
  41. {
  42. // 可以加载任意aot assembly的对应的dll。但要求dll必须与unity build过程中生成的裁剪后的dll一致,而不能直接使用原始dll。
  43. // 我们在BuildProcessor_xxx里添加了处理代码,这些裁剪后的dll在打包时自动被复制到 {项目目录}/HybridCLRData/AssembliesPostIl2CppStrip/{Target} 目录。
  44. /// 注意,补充元数据是给AOT dll补充元数据,而不是给热更新dll补充元数据。
  45. /// 热更新dll不缺元数据,不需要补充,如果调用LoadMetadataForAOTAssembly会返回错误
  46. ///
  47. List<string> aotDllList = new List<string>
  48. {
  49. "mscorlib.dll",
  50. "System.dll",
  51. "System.Core.dll", // 如果使用了Linq,需要这个
  52. "ThirdParty.dll",
  53. "Game.Launcher.dll",
  54. // "Newtonsoft.Json.dll",
  55. // "protobuf-net.dll",
  56. // "Google.Protobuf.dll",
  57. // "MongoDB.Bson.dll",
  58. // "DOTween.Modules.dll",
  59. // "UniTask.dll",
  60. };
  61. foreach (var aotDllName in aotDllList)
  62. {
  63. byte[] dllBytes = GFGAsset.Load<TextAsset>($"{LauncherConfig.DllDirAOT}{aotDllName}.bytes").bytes;
  64. fixed (byte* ptr = dllBytes)
  65. {
  66. // 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码
  67. int err = HybridCLR.RuntimeApi.LoadMetadataForAOTAssembly((IntPtr)ptr, dllBytes.Length);
  68. Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. ret:{err}");
  69. }
  70. }
  71. }
  72. }
  73. }