Init_LoadCode.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // --------------------------
  2. // 作者:烟雨迷离半世殇
  3. // 邮箱:1778139321@qq.com
  4. // 日期:2022年7月10日, 星期日
  5. // --------------------------
  6. using System.Collections.Generic;
  7. using Sirenix.Serialization;
  8. using UnityEngine;
  9. using YooAsset;
  10. using System;
  11. using System.Collections;
  12. using System.Collections.Generic;
  13. using System.Threading;
  14. using Cysharp.Threading.Tasks;
  15. using HybridCLR;
  16. namespace ET
  17. {
  18. public partial class Init
  19. {
  20. // 加载热更层代码
  21. private async UniTask LoadCode()
  22. {
  23. byte[] config = (await YooAssetProxy.GetRawFileAsync("Config_DLLNameListForAOT")).LoadFileData();
  24. DLLNameListForAOT dllNameListForAOT =
  25. SerializationUtility.DeserializeValue<DLLNameListForAOT>(config, DataFormat.JSON);
  26. List<UniTask<RawFileOperation>> tasks = new List<UniTask<RawFileOperation>>();
  27. foreach (var aotDll in dllNameListForAOT.DLLNameList_ForABLoad)
  28. {
  29. Debug.Log($"添加{aotDll}");
  30. tasks.Add(YooAssetProxy.GetRawFileAsync(aotDll));
  31. }
  32. RawFileOperation[] rawFileOperations = await UniTask.WhenAll(tasks);
  33. foreach (var task in rawFileOperations)
  34. {
  35. Debug.Log("准备加载AOT补充元数据");
  36. LoadMetadataForAOTAssembly(task.GetRawBytes());
  37. }
  38. await CodeLoader.Instance.Start();
  39. Log.Info("Dll加载完毕,正式进入游戏流程");
  40. static unsafe void LoadMetadataForAOTAssembly(byte[] dllBytes)
  41. {
  42. fixed (byte* ptr = dllBytes)
  43. {
  44. #if !UNITY_EDITOR
  45. // 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码
  46. LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, HomologousImageMode.SuperSet);
  47. Debug.Log("LoadMetadataForAOTAssembly. ret:" + err);
  48. #endif
  49. }
  50. }
  51. }
  52. }
  53. }