1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 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.MethodBridge
- {
- public class CalliAnalyzer
- {
- private readonly List<ModuleDefMD> _rootModules = new List<ModuleDefMD>();
- private readonly List<CallNativeMethodSignatureInfo> _calliMethodSignatures = new List<CallNativeMethodSignatureInfo>();
- public List<CallNativeMethodSignatureInfo> CalliMethodSignatures => _calliMethodSignatures;
- public CalliAnalyzer(AssemblyCache cache, List<string> assemblyNames)
- {
- foreach (var assemblyName in assemblyNames)
- {
- _rootModules.Add(cache.LoadModule(assemblyName));
- }
- }
- private void CollectCalli()
- {
- 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.HasBody)
- {
- continue;
- }
- foreach (var il in method.Body.Instructions)
- {
- if (il.OpCode.Code == dnlib.DotNet.Emit.Code.Calli)
- {
- MethodSig methodSig = (MethodSig)il.Operand;
- _calliMethodSignatures.Add(new CallNativeMethodSignatureInfo()
- {
- MethodSig = methodSig,
- });
- Debug.Log($"method:{method} calli method signature:{methodSig}");
- }
- }
- }
- }
- }
- public void Run()
- {
- CollectCalli();
- }
- }
- }
|