public static void Invoke(IntPtr method, IntPtr instance, object[] args) { // Check method if (method == IntPtr.Zero) { return; } // Get method structure and invoker CachedInvoker invoker = null; if (!_Invokers.TryGetValue(method, out invoker)) { IL2CPPMethod il2cppMethod = (IL2CPPMethod)Marshal.PtrToStructure(method, typeof(IL2CPPMethod)); NativeSDK.IL2CPPInvoker il2cppInvoker = (NativeSDK.IL2CPPInvoker)Marshal.GetDelegateForFunctionPointer(il2cppMethod.Invoker, typeof(NativeSDK.IL2CPPInvoker)); invoker = new CachedInvoker(il2cppInvoker, il2cppMethod); _Invokers.Add(method, invoker); } // Convert parameters IntPtr[] argPtrs = new IntPtr[args.Length]; for (uint i = 0; i < args.Length; i++) { Type _type = args[i].GetType(); IntPtr _assembly = MapAssembly(_type.Assembly.GetName().Name); argPtrs[i] = NativeSDK.ConvertToIntPtr(args[i], MapType(_assembly, (uint)_type.MetadataToken)); } // Invoke invoker.Invoker(invoker.Method.ptr, method, instance, argPtrs); }
public CachedInvoker(NativeSDK.IL2CPPInvoker invoker, IL2CPPMethod method) { Invoker = invoker; Method = method; }