public static Handle InvokeMember(Handle type, [MarshalAs(UnmanagedType.BStr)] string name, BindingFlags bindingFlags, Handle binder, Handle target, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 6)] Handle[] providedArgs, uint argCount, out Handle exception) { try { Type typeObj = (Type)HandleTable.Get(type); Binder binderObj = (Binder)HandleTable.Get(binder); object targetObj = HandleTable.Get(target); object[] providedArgsObj = Array.ConvertAll(providedArgs, HandleTable.Get); object result = typeObj.InvokeMember(name, bindingFlags, binderObj, targetObj, providedArgsObj); exception = Handle.Zero; providedArgs.Zip(providedArgsObj, (h, o) => HandleTable.Set(h, o)).Count(); if (result != null) { return(AddRef(result)); } else { return(Handle.Zero); } } catch (Exception e) { exception = AddRef(e); return(Handle.Zero); } }
private static object ReceiveInvocation(IntPtr context, object[] args) { for (int i = 0; i < args.Length; ++i) { HandleTable.Set(new IntPtr(i + 1), args[i]); } return(HandleTable.Get(handler(context, (uint)args.Length))); }
#pragma warning disable IDE0001 public static Handle CreateArray(uint argCount) { object[] array = new object[argCount]; for (uint i = 0; i < argCount; ++i) { array[i] = HandleTable.Get(new IntPtr(i + 1)); } return(AddRef(array)); }
public static Handle GetObjectType(Handle handle) { var obj = HandleTable.Get(handle); if (obj == null) { return(Handle.Zero); } var type = obj.GetType(); return(AddRef(type)); }
public static Handle CreateDelegate(Handle delegateType, IntPtr context, out Handle exception) { try { exception = Handle.Zero; var typeObj = (Type)HandleTable.Get(delegateType); return(AddRef(CompileHandlerInvocation(typeObj, args => ReceiveInvocation(context, args)))); } catch (Exception e) { exception = AddRef(e); return(Handle.Zero); } }
public static string GetString(Handle handle) { object obj = HandleTable.Get(handle); if (obj is string) { return((string)obj); } else { try { return(obj.ToString()); } catch (Exception) { return(null); } } }
public static sbyte GetInt8(Handle handle) { var value = HandleTable.Get(handle); return(value is sbyte?(sbyte)value : (sbyte)0); }
public static byte GetBool(Handle handle) { var value = HandleTable.Get(handle); return(value is bool?(byte)((bool)value ? 1 : 0) : (byte)0); }
public static char GetChar(Handle handle) { var value = HandleTable.Get(handle); return(value is char?(char)value : (char)0); }
public static Handle PutObject(Handle handle, Handle value) { return(HandleTable.Set(handle, HandleTable.Get(value))); }
public static double GetFloat64(Handle handle) { var value = HandleTable.Get(handle); return(value is double?(double)value : 0); }
public static float GetFloat32(Handle handle) { var value = HandleTable.Get(handle); return(value is float?(float)value : 0); }
public static ulong GetUInt64(Handle handle) { var value = HandleTable.Get(handle); return(value is ulong?(ulong)value : 0); }
public static Handle Duplicate(Handle handle) { return(AddRef(HandleTable.Get(handle))); }
public static uint GetUInt32(Handle handle) { var value = HandleTable.Get(handle); return(value is uint?(uint)value : 0); }
public static ushort GetUInt16(Handle handle) { var value = HandleTable.Get(handle); return(value is ushort?(ushort)value : (ushort)0); }