CopyStrippedAOTAssembliesHook.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. 
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Reflection;
  6. using UnityEngine;
  7. using UnityEditor;
  8. using System.Runtime.CompilerServices;
  9. using MonoHook;
  10. using HybridCLR.Editor.BuildProcessors;
  11. using System.IO;
  12. namespace HybridCLR.MonoHook
  13. {
  14. #if UNITY_2021_1_OR_NEWER
  15. [InitializeOnLoad]
  16. public class CopyStrippedAOTAssembliesHook
  17. {
  18. private static MethodHook _hook;
  19. static CopyStrippedAOTAssembliesHook()
  20. {
  21. if (_hook == null)
  22. {
  23. Type type = typeof(UnityEditor.EditorApplication).Assembly.GetType("UnityEditorInternal.AssemblyStripper");
  24. MethodInfo miTarget = type.GetMethod("StripAssembliesTo", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
  25. MethodInfo miReplacement = new StripAssembliesDel(OverrideStripAssembliesTo).Method;
  26. MethodInfo miProxy = new StripAssembliesDel(StripAssembliesToProxy).Method;
  27. _hook = new MethodHook(miTarget, miReplacement, miProxy);
  28. _hook.Install();
  29. }
  30. }
  31. private delegate bool StripAssembliesDel(string outputFolder, out string output, out string error, IEnumerable<string> linkXmlFiles, object runInformation);
  32. private static bool OverrideStripAssembliesTo(string outputFolder, out string output, out string error, IEnumerable<string> linkXmlFiles, object runInformation)
  33. {
  34. bool result = StripAssembliesToProxy(outputFolder, out output, out error, linkXmlFiles, runInformation);
  35. if (!result)
  36. {
  37. return false;
  38. }
  39. UnityEngine.Debug.Log($"== StripAssembliesTo outputDir:{outputFolder}");
  40. string outputStrippedDir = HybridCLR.Editor.SettingsUtil.GetAssembliesPostIl2CppStripDir(EditorUserBuildSettings.activeBuildTarget);
  41. Directory.CreateDirectory(outputStrippedDir);
  42. foreach (var aotDll in Directory.GetFiles(outputFolder, "*.dll"))
  43. {
  44. string dstFile = $"{outputStrippedDir}/{Path.GetFileName(aotDll)}";
  45. Debug.Log($"[RunAssemblyStripper] copy aot dll {aotDll} -> {dstFile}");
  46. File.Copy(aotDll, dstFile, true);
  47. }
  48. return result;
  49. }
  50. [MethodImpl(MethodImplOptions.NoOptimization)]
  51. private static bool StripAssembliesToProxy(string outputFolder, out string output, out string error, IEnumerable<string> linkXmlFiles, object runInformation)
  52. {
  53. Debug.LogError("== StripAssembliesToProxy ==");
  54. output = "";
  55. error = "";
  56. return true;
  57. }
  58. }
  59. #endif
  60. }