public static object objc_msgSend(IntPtr receiver, string selector, Type rettype)
{
Type marshalrettype = rettype;
if (rettype == typeof (string))
marshalrettype = typeof (System.IntPtr);
string type = marshalrettype.ToString() + "_System.IntPtr_System.IntPtr";
Type t = TypeResolve(type, false).GetType(type);
object ret;
if (rettype.IsValueType && rettype.Namespace != "System") {
IntPtr ptr = Marshal.AllocHGlobal (Marshal.SizeOf (rettype));
object[] realArgs = new object[3];
realArgs[0] = ptr;
realArgs[1] = receiver;
realArgs[2] = sel_registerName(selector);
t.InvokeMember("objc_msgSend_stret", BindingFlags.InvokeMethod|BindingFlags.Public|BindingFlags.Static, null, null, realArgs);
ret = Marshal.PtrToStructure (ptr, rettype);
Marshal.FreeHGlobal (ptr);
} else {
object[] realArgs = new object[2];
realArgs[0] = receiver;
realArgs[1] = sel_registerName(selector);
ret = t.InvokeMember("objc_msgSend", BindingFlags.InvokeMethod|BindingFlags.Public|BindingFlags.Static, null, null, realArgs);
}
if (rettype == typeof(string))
ret = Marshal.PtrToStringAuto ((IntPtr)ret);
return ret;
}