예제 #1
0
		internal object LoadRemoteFieldNew (IntPtr classPtr, IntPtr fieldPtr) {
			Mono.RuntimeClassHandle classHandle = new Mono.RuntimeClassHandle (classPtr);
			RuntimeFieldHandle fieldHandle = new RuntimeFieldHandle (fieldPtr);
			RuntimeTypeHandle typeHandle = classHandle.GetTypeHandle ();

			FieldInfo field = FieldInfo.GetFieldFromHandle (fieldHandle);

			if (InCurrentContext ()) {
				object o = _rp._server;
				return field.GetValue(o);
			}

			string typeName = Type.GetTypeFromHandle(typeHandle).FullName;
			string fieldName = field.Name;
			object[] inArgs = new object[] { typeName,
							  fieldName };
			object[] outArgsMsg = new object[1];
			MethodInfo minfo = typeof(object).GetMethod("FieldGetter", BindingFlags.NonPublic | BindingFlags.Instance);
			if (minfo == null)
				throw new MissingMethodException ("System.Object", "FieldGetter");
			MonoMethodMessage msg = new MonoMethodMessage (minfo, inArgs, outArgsMsg);
			object[] outArgs;
			Exception exc;
			RealProxy.PrivateInvoke (_rp, msg, out exc, out outArgs);
			if (exc != null)
				throw exc;
			return outArgs[0];
		}
예제 #2
0
        internal object LoadRemoteFieldNew(IntPtr classPtr, IntPtr fieldPtr)
        {
            Mono.RuntimeClassHandle classHandle = new Mono.RuntimeClassHandle(classPtr);
            RuntimeFieldHandle      fieldHandle = new RuntimeFieldHandle(fieldPtr);
            RuntimeTypeHandle       typeHandle  = classHandle.GetTypeHandle();

            FieldInfo field = FieldInfo.GetFieldFromHandle(fieldHandle);

            if (InCurrentContext())
            {
                object o = _rp._server;
                return(field.GetValue(o));
            }

            object[] inArgs = new object[] { Type.GetTypeFromHandle(typeHandle).FullName,
                                             field.Name };
            object[]   outArgsMsg = new object[1];
            MethodInfo minfo      = typeof(object).GetMethod("FieldGetter", BindingFlags.NonPublic | BindingFlags.Instance);

            if (minfo == null)
            {
                throw new MissingMethodException("System.Object", "FieldGetter");
            }
            MonoMethodMessage msg = new MonoMethodMessage(minfo, inArgs, outArgsMsg);

            object[]  outArgs;
            Exception exc;

            RealProxy.PrivateInvoke(_rp, msg, out exc, out outArgs);
            if (exc != null)
            {
                throw exc;
            }
            return(outArgs[0]);
        }
예제 #3
0
        internal void StoreRemoteField(IntPtr classPtr, IntPtr fieldPtr, object arg)
        {
            Mono.RuntimeClassHandle classHandle = new Mono.RuntimeClassHandle(classPtr);
            RuntimeFieldHandle      fieldHandle = new RuntimeFieldHandle(fieldPtr);
            RuntimeTypeHandle       typeHandle  = classHandle.GetTypeHandle();
            FieldInfo field = FieldInfo.GetFieldFromHandle(fieldHandle);

            if (InCurrentContext())
            {
                object o = _rp._server;
                field.SetValue(o, arg);
                return;
            }

            string typeName  = Type.GetTypeFromHandle(typeHandle).FullName;
            string fieldName = field.Name;

            object [] inArgs = new object[] { typeName,
                                              fieldName,
                                              arg };
            MethodInfo minfo = typeof(object).GetMethod("FieldSetter", BindingFlags.NonPublic | BindingFlags.Instance);

            if (minfo == null)
            {
                throw new MissingMethodException("System.Object", "FieldSetter");
            }

            MonoMethodMessage msg = new MonoMethodMessage(minfo, inArgs, null);

            object [] outArgs;
            Exception exc;

            RealProxy.PrivateInvoke(_rp, msg, out exc, out outArgs);
            if (exc != null)
            {
                throw exc;
            }
        }