ReversePInvokeWrapperGeneratorCommand.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using HybridCLR.Editor.ABI;
  2. using HybridCLR.Editor.Link;
  3. using HybridCLR.Editor.Meta;
  4. using HybridCLR.Editor.ReversePInvokeWrap;
  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 static class ReversePInvokeWrapperGeneratorCommand
  17. {
  18. [MenuItem("HybridCLR/Generate/ReversePInvokeWrapper", priority = 103)]
  19. public static void CompileAndGenerateReversePInvokeWrapper()
  20. {
  21. BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
  22. CompileDllCommand.CompileDll(target);
  23. GenerateReversePInvokeWrapper(target);
  24. }
  25. public static void GenerateReversePInvokeWrapper(BuildTarget target)
  26. {
  27. List<string> hotUpdateDlls = SettingsUtil.HotUpdateAssemblyNamesExcludePreserved;
  28. using (var cache = new AssemblyCache(MetaUtil.CreateHotUpdateAndAOTAssemblyResolver(target, hotUpdateDlls)))
  29. {
  30. var analyzer = new ReversePInvokeWrap.Analyzer(cache, hotUpdateDlls);
  31. analyzer.Run();
  32. string outputFile = $"{SettingsUtil.GeneratedCppDir}/ReversePInvokeMethodStub.cpp";
  33. List<ABIReversePInvokeMethodInfo> methods = analyzer.BuildABIMethods();
  34. Debug.Log($"GenerateReversePInvokeWrapper. wraperCount:{methods.Sum(m => m.Count)} output:{outputFile}");
  35. var generator = new Generator();
  36. generator.Generate(methods, outputFile);
  37. Debug.LogFormat("[ReversePInvokeWrapperGeneratorCommand] output:{0}", outputFile);
  38. }
  39. MethodBridgeGeneratorCommand.CleanIl2CppBuildCache();
  40. }
  41. }
  42. }