using dnlib.DotNet; using HybridCLR.Editor.ABI; using HybridCLR.Editor.Meta; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Text; using System.Threading.Tasks; using UnityEngine; using TypeInfo = HybridCLR.Editor.ABI.TypeInfo; namespace HybridCLR.Editor.MethodBridge { public abstract class PlatformGeneratorBase { public abstract PlatformABI PlatformABI { get; } public abstract void GenerateManaged2NativeMethod(MethodDesc method, List lines); public abstract void GenerateNative2ManagedMethod(MethodDesc method, List lines); public abstract void GenerateAdjustThunkMethod(MethodDesc method, List outputLines); public void GenerateManaged2NativeStub(List methods, List lines) { lines.Add($@" Managed2NativeMethodInfo hybridclr::interpreter::g_managed2nativeStub[] = {{ "); foreach (var method in methods) { lines.Add($"\t{{\"{method.CreateInvokeSigName()}\", __M2N_{method.CreateInvokeSigName()}}},"); } lines.Add($"\t{{\"\", nullptr}},"); lines.Add("};"); } public void GenerateNative2ManagedStub(List methods, List lines) { lines.Add($@" Native2ManagedMethodInfo hybridclr::interpreter::g_native2managedStub[] = {{ "); foreach (var method in methods) { lines.Add($"\t{{\"{method.CreateInvokeSigName()}\", (Il2CppMethodPointer)__N2M_{method.CreateInvokeSigName()}}},"); } lines.Add($"\t{{nullptr, nullptr}},"); lines.Add("};"); } public void GenerateAdjustThunkStub(List methods, List lines) { lines.Add($@" NativeAdjustThunkMethodInfo hybridclr::interpreter::g_adjustThunkStub[] = {{ "); foreach (var method in methods) { lines.Add($"\t{{\"{method.CreateInvokeSigName()}\", (Il2CppMethodPointer)__N2M_AdjustorThunk_{method.CreateCallSigName()}}},"); } lines.Add($"\t{{nullptr, nullptr}},"); lines.Add("};"); } } }