MethodBridgeHelper.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using HybridCLR.Editor.Generators;
  2. using HybridCLR.Editor.Generators.MethodBridge;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using UnityEditor;
  11. using UnityEngine;
  12. namespace HybridCLR.Editor
  13. {
  14. internal class MethodBridgeHelper
  15. {
  16. private static void CleanIl2CppBuildCache()
  17. {
  18. string il2cppBuildCachePath = BuildConfig.Il2CppBuildCacheDir;
  19. if (!Directory.Exists(il2cppBuildCachePath))
  20. {
  21. return;
  22. }
  23. Debug.Log($"clean il2cpp build cache:{il2cppBuildCachePath}");
  24. Directory.Delete(il2cppBuildCachePath, true);
  25. }
  26. private static List<Assembly> CollectDependentAssemblies(Dictionary<string, Assembly> allAssByName, List<Assembly> dlls)
  27. {
  28. for(int i = 0; i < dlls.Count; i++)
  29. {
  30. Assembly ass = dlls[i];
  31. foreach (var depAssName in ass.GetReferencedAssemblies())
  32. {
  33. if (!allAssByName.ContainsKey(depAssName.Name))
  34. {
  35. Debug.Log($"ignore ref assembly:{depAssName.Name}");
  36. continue;
  37. }
  38. Assembly depAss = allAssByName[depAssName.Name];
  39. if (!dlls.Contains(depAss))
  40. {
  41. dlls.Add(depAss);
  42. }
  43. }
  44. }
  45. return dlls;
  46. }
  47. private static List<Assembly> GetScanAssembiles()
  48. {
  49. var allAssByName = new Dictionary<string, Assembly>();
  50. foreach(var ass in AppDomain.CurrentDomain.GetAssemblies())
  51. {
  52. allAssByName[ass.GetName().Name] = ass;
  53. }
  54. //CompileDllHelper.CompileDllActiveBuildTarget();
  55. var rootAssemblies = BuildConfig.HotUpdateAssemblies
  56. .Select(dll => Path.GetFileNameWithoutExtension(dll)).Concat(GeneratorConfig.GetExtraAssembiles())
  57. .Where(name => allAssByName.ContainsKey(name)).Select(name => allAssByName[name]).ToList();
  58. //var rootAssemblies = GeneratorConfig.GetExtraAssembiles()
  59. // .Where(name => allAssByName.ContainsKey(name)).Select(name => allAssByName[name]).ToList();
  60. CollectDependentAssemblies(allAssByName, rootAssemblies);
  61. rootAssemblies.Sort((a, b) => a.GetName().Name.CompareTo(b.GetName().Name));
  62. Debug.Log($"assembly count:{rootAssemblies.Count}");
  63. foreach(var ass in rootAssemblies)
  64. {
  65. //Debug.Log($"scan assembly:{ass.GetName().Name}");
  66. }
  67. return rootAssemblies;
  68. }
  69. private static void GenerateMethodBridgeCppFile(PlatformABI platform, string fileName, bool optimized)
  70. {
  71. string outputFile = $"{BuildConfig.MethodBridgeCppDir}/{fileName}.cpp";
  72. var g = new MethodBridgeGenerator(new MethodBridgeGeneratorOptions()
  73. {
  74. CallConvention = platform,
  75. HotfixAssemblies = BuildConfig.HotUpdateAssemblies.Select(name =>
  76. AppDomain.CurrentDomain.GetAssemblies().First(ass => ass.GetName().Name + ".dll" == name)).ToList(),
  77. AllAssemblies = optimized ? GetScanAssembiles() : AppDomain.CurrentDomain.GetAssemblies().ToList(),
  78. OutputFile = outputFile,
  79. Optimized = optimized,
  80. });
  81. g.PrepareMethods();
  82. g.Generate();
  83. Debug.LogFormat("== output:{0} ==", outputFile);
  84. CleanIl2CppBuildCache();
  85. }
  86. //[MenuItem("HybridCLR/MethodBridge/Arm64")]
  87. //public static void MethodBridge_Arm64()
  88. //{
  89. // GenerateMethodBridgeCppFile(PlatformABI.Arm64, "MethodBridge_Arm64");
  90. //}
  91. //[MenuItem("HybridCLR/MethodBridge/Universal64")]
  92. //public static void MethodBridge_Universal64()
  93. //{
  94. // GenerateMethodBridgeCppFile(PlatformABI.Universal64, "MethodBridge_Universal64");
  95. //}
  96. //[MenuItem("HybridCLR/MethodBridge/Universal32")]
  97. //public static void MethodBridge_Universal32()
  98. //{
  99. // GenerateMethodBridgeCppFile(PlatformABI.Universal32, "MethodBridge_Universal32");
  100. //}
  101. public static void GenerateMethodBridgeAll(bool optimized)
  102. {
  103. GenerateMethodBridgeCppFile(PlatformABI.Arm64, "MethodBridge_Arm64", optimized);
  104. GenerateMethodBridgeCppFile(PlatformABI.Universal64, "MethodBridge_Universal64", optimized);
  105. GenerateMethodBridgeCppFile(PlatformABI.Universal32, "MethodBridge_Universal32", optimized);
  106. }
  107. [MenuItem("HybridCLR/MethodBridge/All_高度精简")]
  108. public static void MethodBridge_All_Optimized()
  109. {
  110. GenerateMethodBridgeAll(true);
  111. }
  112. [MenuItem("HybridCLR/MethodBridge/All_完整(新手及开发期推荐)")]
  113. public static void MethodBridge_All_Normal()
  114. {
  115. GenerateMethodBridgeAll(false);
  116. }
  117. }
  118. }