using dnlib.DotNet; using HybridCLR.Editor.Meta; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; namespace HybridCLR.Editor.ReversePInvokeWrap { public class ReversePInvokeMethodInfo { public MethodDef Method { get; set; } public CustomAttribute GenerationAttribute { get; set; } } public class Analyzer { private readonly List _rootModules = new List(); public Analyzer(AssemblyCache cache, List assemblyNames) { foreach(var assemblyName in assemblyNames) { _rootModules.Add(cache.LoadModule(assemblyName)); } } public List CollectMonoPInvokeCallbackMethods() { var wrapperMethods = new List(); foreach(var mod in _rootModules) { Debug.Log($"ass:{mod.FullName} methodcount:{mod.Metadata.TablesStream.MethodTable.Rows}"); for (uint rid = 1, n = mod.Metadata.TablesStream.MethodTable.Rows; rid <= n; rid++) { var method = mod.ResolveMethod(rid); //Debug.Log($"method:{method}"); if (!method.IsStatic || !method.HasCustomAttributes) { continue; } CustomAttribute wa = method.CustomAttributes.FirstOrDefault(ca => ca.AttributeType.FullName == "AOT.MonoPInvokeCallbackAttribute"); if (wa == null) { continue; } //foreach (var ca in method.CustomAttributes) //{ // Debug.Log($"{ca.AttributeType.FullName} {ca.TypeFullName}"); //} wrapperMethods.Add(new ReversePInvokeMethodInfo() { Method = method, GenerationAttribute = method.CustomAttributes.FirstOrDefault(ca => ca.AttributeType.FullName == "HybridCLR.ReversePInvokeWrapperGenerationAttribute"), }); } } return wrapperMethods; } } }