Cocoa.ObjCMessaging.objc_msgSend C# (CSharp) Method

objc_msgSend() public static method

public static objc_msgSend ( IntPtr receiver, string selector, Type rettype ) : object
receiver System.IntPtr
selector string
rettype System.Type
return object
        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;
        }