MethodBridgeGeneratorCommand.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using HybridCLR.Editor;
  2. using HybridCLR.Editor.ABI;
  3. using HybridCLR.Editor.Meta;
  4. using HybridCLR.Editor.MethodBridge;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Reflection;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using UnityEditor;
  13. using UnityEngine;
  14. namespace HybridCLR.Editor.Commands
  15. {
  16. public class MethodBridgeGeneratorCommand
  17. {
  18. public static void CleanIl2CppBuildCache()
  19. {
  20. string il2cppBuildCachePath = SettingsUtil.Il2CppBuildCacheDir;
  21. if (!Directory.Exists(il2cppBuildCachePath))
  22. {
  23. return;
  24. }
  25. Debug.Log($"clean il2cpp build cache:{il2cppBuildCachePath}");
  26. Directory.Delete(il2cppBuildCachePath, true);
  27. }
  28. private static void GenerateMethodBridgeCppFile(Analyzer analyzer, PlatformABI platform, string templateCode, string outputFile)
  29. {
  30. var g = new Generator(new Generator.Options()
  31. {
  32. PlatformABI = platform,
  33. TemplateCode = templateCode,
  34. OutputFile = outputFile,
  35. GenericMethods = analyzer.GenericMethods,
  36. NotGenericMethods = analyzer.NotGenericMethods,
  37. });
  38. g.PrepareMethods();
  39. g.Generate();
  40. Debug.LogFormat("== output:{0} ==", outputFile);
  41. }
  42. [MenuItem("HybridCLR/Generate/MethodBridge", priority = 101)]
  43. public static void CompileAndGenerateMethodBridge()
  44. {
  45. BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
  46. CompileDllCommand.CompileDll(target);
  47. GenerateMethodBridge(target);
  48. }
  49. public static void GenerateMethodBridge(BuildTarget target)
  50. {
  51. List<string> hotUpdateDllNames = SettingsUtil.HotUpdateAssemblyNames;
  52. using (AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateHotUpdateAndAOTAssemblyResolver(target, hotUpdateDllNames), hotUpdateDllNames))
  53. {
  54. var analyzer = new Analyzer(new Analyzer.Options
  55. {
  56. MaxIterationCount = Math.Min(20, SettingsUtil.HybridCLRSettings.maxMethodBridgeGenericIteration),
  57. Collector = collector,
  58. });
  59. analyzer.Run();
  60. var tasks = new List<Task>();
  61. string templateCode = File.ReadAllText($"{SettingsUtil.TemplatePathInPackage}/MethodBridgeStub.cpp");
  62. foreach (PlatformABI platform in Enum.GetValues(typeof(PlatformABI)))
  63. {
  64. string outputFile = $"{SettingsUtil.GeneratedCppDir}/MethodBridge_{platform}.cpp";
  65. tasks.Add(Task.Run(() =>
  66. {
  67. GenerateMethodBridgeCppFile(analyzer, platform, templateCode, outputFile);
  68. }));
  69. }
  70. Task.WaitAll(tasks.ToArray());
  71. }
  72. CleanIl2CppBuildCache();
  73. }
  74. }
  75. }