1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- using HybridCLR.Editor;
- using HybridCLR.Editor.ABI;
- using HybridCLR.Editor.Meta;
- using HybridCLR.Editor.MethodBridge;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using System.Threading.Tasks;
- using UnityEditor;
- using UnityEditor.Build;
- using UnityEngine;
- namespace HybridCLR.Editor.Commands
- {
- using Analyzer = HybridCLR.Editor.MethodBridge.Analyzer;
- public class MethodBridgeGeneratorCommand
- {
- public static void CleanIl2CppBuildCache()
- {
- string il2cppBuildCachePath = SettingsUtil.Il2CppBuildCacheDir;
- if (!Directory.Exists(il2cppBuildCachePath))
- {
- return;
- }
- Debug.Log($"clean il2cpp build cache:{il2cppBuildCachePath}");
- Directory.Delete(il2cppBuildCachePath, true);
- }
- private static void GenerateMethodBridgeCppFile(IReadOnlyCollection<GenericMethod> genericMethods, List<RawMonoPInvokeCallbackMethodInfo> reversePInvokeMethods, IReadOnlyCollection<CallNativeMethodSignatureInfo> calliMethodSignatures, string tempFile, string outputFile)
- {
- string templateCode = File.ReadAllText(tempFile, Encoding.UTF8);
- var g = new Generator(new Generator.Options()
- {
- TemplateCode = templateCode,
- OutputFile = outputFile,
- GenericMethods = genericMethods,
- ReversePInvokeMethods = reversePInvokeMethods,
- CalliMethodSignatures = calliMethodSignatures,
- Development = EditorUserBuildSettings.development,
- });
- g.Generate();
- Debug.LogFormat("[MethodBridgeGeneratorCommand] output:{0}", outputFile);
- }
- [MenuItem("HybridCLR/Generate/MethodBridgeAndReversePInvokeWrapper", priority = 101)]
- public static void GenerateMethodBridgeAndReversePInvokeWrapper()
- {
- BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
- GenerateMethodBridgeAndReversePInvokeWrapper(target);
- }
- public static void GenerateMethodBridgeAndReversePInvokeWrapper(BuildTarget target)
- {
- string aotDllDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);
- List<string> aotAssemblyNames = Directory.Exists(aotDllDir) ?
- Directory.GetFiles(aotDllDir, "*.dll", SearchOption.TopDirectoryOnly).Select(Path.GetFileNameWithoutExtension).ToList()
- : new List<string>();
- if (aotAssemblyNames.Count == 0)
- {
- throw new Exception($"no aot assembly found. please run `HybridCLR/Generate/All` or `HybridCLR/Generate/AotDlls` to generate aot dlls before runing `HybridCLR/Generate/MethodBridge`");
- }
- AssemblyReferenceDeepCollector collector = new AssemblyReferenceDeepCollector(MetaUtil.CreateAOTAssemblyResolver(target), aotAssemblyNames);
- var methodBridgeAnalyzer = new Analyzer(new Analyzer.Options
- {
- MaxIterationCount = Math.Min(20, SettingsUtil.HybridCLRSettings.maxMethodBridgeGenericIteration),
- Collector = collector,
- });
- methodBridgeAnalyzer.Run();
- List<string> hotUpdateDlls = SettingsUtil.HotUpdateAssemblyNamesExcludePreserved;
- var cache = new AssemblyCache(MetaUtil.CreateHotUpdateAndAOTAssemblyResolver(target, hotUpdateDlls));
- var reversePInvokeAnalyzer = new MonoPInvokeCallbackAnalyzer(cache, hotUpdateDlls);
- reversePInvokeAnalyzer.Run();
- var calliAnalyzer = new CalliAnalyzer(cache, hotUpdateDlls);
- calliAnalyzer.Run();
- var pinvokeAnalyzer = new PInvokeAnalyzer(cache, hotUpdateDlls);
- pinvokeAnalyzer.Run();
- var callPInvokeMethodSignatures = pinvokeAnalyzer.PInvokeMethodSignatures;
- string templateFile = $"{SettingsUtil.TemplatePathInPackage}/MethodBridge.cpp.tpl";
- string outputFile = $"{SettingsUtil.GeneratedCppDir}/MethodBridge.cpp";
- var callNativeMethodSignatures = calliAnalyzer.CalliMethodSignatures.Concat(pinvokeAnalyzer.PInvokeMethodSignatures).ToList();
- GenerateMethodBridgeCppFile(methodBridgeAnalyzer.GenericMethods, reversePInvokeAnalyzer.ReversePInvokeMethods, callNativeMethodSignatures, templateFile, outputFile);
- CleanIl2CppBuildCache();
- }
- }
- }
|