MethodBridgeHelper.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using HybridCLR.Generators;
  2. using HybridCLR.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
  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.AllHotUpdateDllNames
  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)
  70. {
  71. string outputFile = $"{BuildConfig.MethodBridgeCppDir}/{fileName}.cpp";
  72. var g = new MethodBridgeGenerator(new MethodBridgeGeneratorOptions()
  73. {
  74. CallConvention = platform,
  75. Assemblies = GetScanAssembiles(),
  76. OutputFile = outputFile,
  77. });
  78. g.PrepareMethods();
  79. g.Generate();
  80. Debug.LogFormat("== output:{0} ==", outputFile);
  81. CleanIl2CppBuildCache();
  82. }
  83. [MenuItem("HybridCLR/MethodBridge/Arm64")]
  84. public static void MethodBridge_Arm64()
  85. {
  86. GenerateMethodBridgeCppFile(PlatformABI.Arm64, "MethodBridge_Arm64");
  87. }
  88. [MenuItem("HybridCLR/MethodBridge/Universal64")]
  89. public static void MethodBridge_Universal64()
  90. {
  91. GenerateMethodBridgeCppFile(PlatformABI.Universal64, "MethodBridge_Universal64");
  92. }
  93. [MenuItem("HybridCLR/MethodBridge/Universal32")]
  94. public static void MethodBridge_Universal32()
  95. {
  96. GenerateMethodBridgeCppFile(PlatformABI.Universal32, "MethodBridge_Universal32");
  97. }
  98. [MenuItem("HybridCLR/MethodBridge/All")]
  99. public static void MethodBridge_All()
  100. {
  101. GenerateMethodBridgeCppFile(PlatformABI.Arm64, "MethodBridge_Arm64");
  102. GenerateMethodBridgeCppFile(PlatformABI.Universal64, "MethodBridge_Universal64");
  103. GenerateMethodBridgeCppFile(PlatformABI.Universal32, "MethodBridge_Universal32");
  104. }
  105. }
  106. }