1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- using dnlib.DotNet;
- using HybridCLR.Editor.Meta;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.CompilerServices;
- using System.Text;
- using System.Threading.Tasks;
- using UnityEngine;
- namespace HybridCLR.Editor.MethodBridge
- {
- public class PInvokeAnalyzer
- {
- private readonly List<ModuleDefMD> _rootModules = new List<ModuleDefMD>();
- private readonly List<CallNativeMethodSignatureInfo> _pinvokeMethodSignatures = new List<CallNativeMethodSignatureInfo>();
- public List<CallNativeMethodSignatureInfo> PInvokeMethodSignatures => _pinvokeMethodSignatures;
- public PInvokeAnalyzer(AssemblyCache cache, List<string> assemblyNames)
- {
- foreach (var assemblyName in assemblyNames)
- {
- _rootModules.Add(cache.LoadModule(assemblyName));
- }
- }
- private CallingConvention GetCallingConvention(MethodDef method)
- {
- switch (method.ImplMap.CallConv)
- {
- case PInvokeAttributes.CallConvWinapi: return CallingConvention.Default;
- case PInvokeAttributes.CallConvCdecl: return CallingConvention.C;
- case PInvokeAttributes.CallConvStdCall: return CallingConvention.StdCall;
- case PInvokeAttributes.CallConvThiscall: return CallingConvention.ThisCall;
- case PInvokeAttributes.CallConvFastcall: return CallingConvention.FastCall;
- default: return CallingConvention.Default;
- }
- }
- public void Run()
- {
- foreach (var mod in _rootModules)
- {
- foreach (TypeDef type in mod.GetTypes())
- {
- foreach (MethodDef method in type.Methods)
- {
- if (method.IsPinvokeImpl)
- {
- if (!MetaUtil.IsSupportedPInvokeMethodSignature(method.MethodSig))
- {
- Debug.LogError($"PInvoke method {method.FullName} has unsupported parameter or return type. Please check the method signature.");
- }
- _pinvokeMethodSignatures.Add(new CallNativeMethodSignatureInfo
- {
- MethodSig = method.MethodSig,
- Callvention = method.HasImplMap? GetCallingConvention(method) : (CallingConvention?)null,
- });
- }
- }
- }
- }
- }
- }
- }
|