CodeLoader.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Reflection;
  5. using HybridCLR;
  6. using UnityEngine;
  7. namespace ET
  8. {
  9. public class CodeLoader: Singleton<CodeLoader>, ISingletonAwake
  10. {
  11. private Assembly modelAssembly;
  12. private Assembly modelViewAssembly;
  13. private Dictionary<string, TextAsset> dlls;
  14. private Dictionary<string, TextAsset> aotDlls;
  15. public void Awake()
  16. {
  17. }
  18. public async ETTask DownloadAsync()
  19. {
  20. if (!Define.IsEditor)
  21. {
  22. this.dlls = await ResourcesComponent.Instance.LoadAllAssetsAsync<TextAsset>($"Assets/Bundles/Code/Unity.Model.dll.bytes");
  23. this.aotDlls = await ResourcesComponent.Instance.LoadAllAssetsAsync<TextAsset>($"Assets/Bundles/AotDlls/mscorlib.dll.bytes");
  24. }
  25. }
  26. public void Start()
  27. {
  28. byte[] modelAssBytes;
  29. byte[] modelPdbBytes;
  30. byte[] modelViewAssBytes;
  31. byte[] modelViewPdbBytes;
  32. if (!Define.IsEditor)
  33. {
  34. modelAssBytes = this.dlls["Unity.Model.dll"].bytes;
  35. modelPdbBytes = this.dlls["Unity.Model.pdb"].bytes;
  36. modelViewAssBytes = this.dlls["Unity.ModelView.dll"].bytes;
  37. modelViewPdbBytes = this.dlls["Unity.ModelView.pdb"].bytes;
  38. // 如果需要测试,可替换成下面注释的代码直接加载Assets/Bundles/Code/Unity.Model.dll.bytes,但真正打包时必须使用上面的代码
  39. //modelAssBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.Model.dll.bytes"));
  40. //modelPdbBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.Model.pdb.bytes"));
  41. //modelViewAssBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.ModelView.dll.bytes"));
  42. //modelViewPdbBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.ModelView.pdb.bytes"));
  43. if (Define.EnableIL2CPP)
  44. {
  45. foreach (var kv in this.aotDlls)
  46. {
  47. TextAsset textAsset = kv.Value;
  48. RuntimeApi.LoadMetadataForAOTAssembly(textAsset.bytes, HomologousImageMode.SuperSet);
  49. }
  50. }
  51. }
  52. else
  53. {
  54. modelAssBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.Model.dll.bytes"));
  55. modelPdbBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.Model.pdb.bytes"));
  56. modelViewAssBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.ModelView.dll.bytes"));
  57. modelViewPdbBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.ModelView.pdb.bytes"));
  58. }
  59. this.modelAssembly = Assembly.Load(modelAssBytes, modelPdbBytes);
  60. this.modelViewAssembly = Assembly.Load(modelViewAssBytes, modelViewPdbBytes);
  61. (Assembly hotfixAssembly, Assembly hotfixViewAssembly) = this.LoadHotfix();
  62. World.Instance.AddSingleton<CodeTypes, Assembly[]>(new[]
  63. {
  64. typeof (World).Assembly, typeof (Init).Assembly, this.modelAssembly, this.modelViewAssembly, hotfixAssembly,
  65. hotfixViewAssembly
  66. });
  67. IStaticMethod start = new StaticMethod(this.modelAssembly, "ET.Entry", "Start");
  68. start.Run();
  69. }
  70. private (Assembly, Assembly) LoadHotfix()
  71. {
  72. byte[] hotfixAssBytes;
  73. byte[] hotfixPdbBytes;
  74. byte[] hotfixViewAssBytes;
  75. byte[] hotfixViewPdbBytes;
  76. if (!Define.IsEditor)
  77. {
  78. hotfixAssBytes = this.dlls["Unity.Hotfix.dll"].bytes;
  79. hotfixPdbBytes = this.dlls["Unity.Hotfix.pdb"].bytes;
  80. hotfixViewAssBytes = this.dlls["Unity.HotfixView.dll"].bytes;
  81. hotfixViewPdbBytes = this.dlls["Unity.HotfixView.pdb"].bytes;
  82. // 如果需要测试,可替换成下面注释的代码直接加载Assets/Bundles/Code/Hotfix.dll.bytes,但真正打包时必须使用上面的代码
  83. //hotfixAssBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.Hotfix.dll.bytes"));
  84. //hotfixPdbBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.Hotfix.pdb.bytes"));
  85. //hotfixViewAssBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.HotfixView.dll.bytes"));
  86. //hotfixViewPdbBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.HotfixView.pdb.bytes"));
  87. }
  88. else
  89. {
  90. hotfixAssBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.Hotfix.dll.bytes"));
  91. hotfixPdbBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.Hotfix.pdb.bytes"));
  92. hotfixViewAssBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.HotfixView.dll.bytes"));
  93. hotfixViewPdbBytes = File.ReadAllBytes(Path.Combine(Define.CodeDir, "Unity.HotfixView.pdb.bytes"));
  94. }
  95. Assembly hotfixAssembly = Assembly.Load(hotfixAssBytes, hotfixPdbBytes);
  96. Assembly hotfixViewAssembly = Assembly.Load(hotfixViewAssBytes, hotfixViewPdbBytes);
  97. return (hotfixAssembly, hotfixViewAssembly);
  98. }
  99. public void Reload()
  100. {
  101. (Assembly hotfixAssembly, Assembly hotfixViewAssembly) = this.LoadHotfix();
  102. CodeTypes codeTypes = World.Instance.AddSingleton<CodeTypes, Assembly[]>(new[]
  103. {
  104. typeof (World).Assembly, typeof (Init).Assembly, this.modelAssembly, this.modelViewAssembly, hotfixAssembly,
  105. hotfixViewAssembly
  106. });
  107. codeTypes.CreateCode();
  108. Log.Debug($"reload dll finish!");
  109. }
  110. }
  111. }