123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- using dnlib.DotNet;
- using HybridCLR.Editor.ABI;
- using HybridCLR.Editor.Meta;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using CallingConvention = System.Runtime.InteropServices.CallingConvention;
- using UnityEngine;
- namespace HybridCLR.Editor.MethodBridge
- {
- public class RawMonoPInvokeCallbackMethodInfo
- {
- public MethodDef Method { get; set; }
- public CustomAttribute GenerationAttribute { get; set; }
- }
- public class MonoPInvokeCallbackAnalyzer
- {
- private readonly List<ModuleDefMD> _rootModules = new List<ModuleDefMD>();
- private readonly List<RawMonoPInvokeCallbackMethodInfo> _reversePInvokeMethods = new List<RawMonoPInvokeCallbackMethodInfo>();
- public List<RawMonoPInvokeCallbackMethodInfo> ReversePInvokeMethods => _reversePInvokeMethods;
- public MonoPInvokeCallbackAnalyzer(AssemblyCache cache, List<string> assemblyNames)
- {
- foreach (var assemblyName in assemblyNames)
- {
- _rootModules.Add(cache.LoadModule(assemblyName));
- }
- }
- private void CollectReversePInvokeMethods()
- {
- foreach (var mod in _rootModules)
- {
- Debug.Log($"ass:{mod.FullName} method count:{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.Name == "MonoPInvokeCallbackAttribute");
- if (wa == null)
- {
- continue;
- }
- if (!MetaUtil.IsSupportedPInvokeMethodSignature(method.MethodSig))
- {
- Debug.LogError($"MonoPInvokeCallback method {method.FullName} has unsupported parameter or return type. Please check the method signature.");
- }
- //foreach (var ca in method.CustomAttributes)
- //{
- // Debug.Log($"{ca.AttributeType.FullName} {ca.TypeFullName}");
- //}
- _reversePInvokeMethods.Add(new RawMonoPInvokeCallbackMethodInfo()
- {
- Method = method,
- GenerationAttribute = method.CustomAttributes.FirstOrDefault(ca => ca.AttributeType.FullName == "HybridCLR.ReversePInvokeWrapperGenerationAttribute"),
- });
- }
- }
- }
- public void Run()
- {
- CollectReversePInvokeMethods();
- }
- }
- }
|