コード例 #1
0
 //
 // Creates the appropriate flavor of Invoker depending on the calling convention "shape" (static, instance or virtual.)
 //
 internal static MethodInvoker CreateMethodInvoker(MetadataReader reader, RuntimeTypeHandle declaringTypeHandle, MethodHandle methodHandle, MethodInvokeInfo methodInvokeInfo)
 {
     Method method = methodHandle.GetMethod(reader);
     MethodAttributes methodAttributes = method.Flags;
     if (0 != (methodAttributes & MethodAttributes.Static))
         return new StaticMethodInvoker(methodInvokeInfo);
     else if (methodInvokeInfo.VirtualResolveData != IntPtr.Zero)
         return new VirtualMethodInvoker(methodInvokeInfo, declaringTypeHandle);
     else
         return new InstanceMethodInvoker(methodInvokeInfo, declaringTypeHandle);
 }
コード例 #2
0
        protected sealed override object?Invoke(object?thisObject, object?[]?arguments, BinderBundle binderBundle, bool wrapInTargetInvocationException)
        {
            object?result = MethodInvokeInfo.Invoke(
                null, // this pointer is ignored for static methods
                MethodInvokeInfo.LdFtnResult,
                arguments,
                binderBundle,
                wrapInTargetInvocationException);

            System.Diagnostics.DebugAnnotations.PreviousCallContainsDebuggerStepInCode();
            return(result);
        }
コード例 #3
0
        public NullableInstanceMethodInvoker(MetadataReader reader, MethodHandle methodHandle, RuntimeTypeHandle nullableTypeHandle, MethodInvokeInfo methodInvokeInfo)
        {
            _id = NullableMethodId.None;
            _nullableTypeHandle = nullableTypeHandle;
            Method method = methodHandle.GetMethod(reader);
            if (MethodAttributes.Public == (method.Flags & MethodAttributes.MemberAccessMask))
            {
                // Note: Since we control the definition of Nullable<>, we're not checking signatures here.
                String name = method.Name.GetConstantStringValue(reader).Value;
                switch (name)
                {
                    case "GetType":
                        _id = NullableMethodId.GetType;
                        break;

                    case "ToString":
                        _id = NullableMethodId.ToString;
                        break;

                    case "Equals":
                        _id = NullableMethodId.Equals;
                        break;

                    case "GetHashCode":
                        _id = NullableMethodId.GetHashCode;
                        break;

                    case ".ctor":
                        _id = NullableMethodId.Ctor;
                        break;

                    case "get_HasValue":
                        _id = NullableMethodId.get_HasValue;
                        break;

                    case "get_Value":
                        _id = NullableMethodId.get_Value;
                        break;

                    case "GetValueOrDefault":
                        IEnumerator<ParameterTypeSignatureHandle> parameters = method.Signature.GetMethodSignature(reader).Parameters.GetEnumerator();
                        if (parameters.MoveNext())
                            _id = NullableMethodId.GetValueOrDefault_1;
                        else
                            _id = NullableMethodId.GetValueOrDefault_0;
                        break;

                    default:
                        break;
                }
            }
        }
コード例 #4
0
        protected sealed override object?Invoke(object?thisObject, object?[]?arguments, BinderBundle binderBundle, bool wrapInTargetInvocationException)
        {
            if (MethodInvokeInfo.IsSupportedSignature) // Workaround to match expected argument validation order
            {
                ValidateThis(thisObject, _declaringTypeHandle);
            }

            object?result = MethodInvokeInfo.Invoke(
                thisObject,
                MethodInvokeInfo.LdFtnResult,
                arguments,
                binderBundle,
                wrapInTargetInvocationException);

            System.Diagnostics.DebugAnnotations.PreviousCallContainsDebuggerStepInCode();
            return(result);
        }
コード例 #5
0
 public InstanceMethodInvoker(MethodInvokeInfo methodInvokeInfo, RuntimeTypeHandle declaringTypeHandle)
     : base(methodInvokeInfo)
 {
     _declaringTypeHandle = declaringTypeHandle;
 }
コード例 #6
0
        public NullableInstanceMethodInvoker(MetadataReader reader, MethodHandle methodHandle, RuntimeTypeHandle nullableTypeHandle, MethodInvokeInfo methodInvokeInfo)
        {
            _id = NullableMethodId.None;
            _nullableTypeHandle = nullableTypeHandle;
            Method method = methodHandle.GetMethod(reader);

            if (MethodAttributes.Public == (method.Flags & MethodAttributes.MemberAccessMask))
            {
                // Note: Since we control the definition of Nullable<>, we're not checking signatures here.
                String name = method.Name.GetConstantStringValue(reader).Value;
                switch (name)
                {
                case "GetType":
                    _id = NullableMethodId.GetType;
                    break;

                case "ToString":
                    _id = NullableMethodId.ToString;
                    break;

                case "Equals":
                    _id = NullableMethodId.Equals;
                    break;

                case "GetHashCode":
                    _id = NullableMethodId.GetHashCode;
                    break;

                case ".ctor":
                    _id = NullableMethodId.Ctor;
                    break;

                case "get_HasValue":
                    _id = NullableMethodId.get_HasValue;
                    break;

                case "get_Value":
                    _id = NullableMethodId.get_Value;
                    break;

                case "GetValueOrDefault":
                    IEnumerator <Handle> parameters = method.Signature.GetMethodSignature(reader).Parameters.GetEnumerator();
                    if (parameters.MoveNext())
                    {
                        _id = NullableMethodId.GetValueOrDefault_1;
                    }
                    else
                    {
                        _id = NullableMethodId.GetValueOrDefault_0;
                    }
                    break;

                default:
                    break;
                }
            }
        }
コード例 #7
0
        //
        // Creates the appropriate flavor of Invoker depending on the calling convention "shape" (static, instance or virtual.)
        //
        internal static MethodInvoker CreateMethodInvoker(RuntimeTypeHandle declaringTypeHandle, QMethodDefinition methodHandle, MethodInvokeInfo methodInvokeInfo)
        {
            bool isStatic = false;

            if (methodHandle.IsNativeFormatMetadataBased)
            {
                Method           method           = methodHandle.NativeFormatHandle.GetMethod(methodHandle.NativeFormatReader);
                MethodAttributes methodAttributes = method.Flags;
                if (0 != (methodAttributes & MethodAttributes.Static))
                {
                    isStatic = true;
                }
            }
#if ECMA_METADATA_SUPPORT
            if (methodHandle.IsEcmaFormatMetadataBased)
            {
                var  reader     = methodHandle.EcmaFormatReader;
                var  method     = reader.GetMethodDefinition(methodHandle.EcmaFormatHandle);
                var  blobReader = reader.GetBlobReader(method.Signature);
                byte sigByte    = blobReader.ReadByte();
                if ((sigByte & (byte)System.Reflection.Metadata.SignatureAttributes.Instance) == 0)
                {
                    isStatic = true;
                }
            }
#endif

            if (isStatic)
            {
                return(new StaticMethodInvoker(methodInvokeInfo));
            }
            else if (methodInvokeInfo.VirtualResolveData != IntPtr.Zero)
            {
                return(new VirtualMethodInvoker(methodInvokeInfo, declaringTypeHandle));
            }
            else
            {
                return(new InstanceMethodInvoker(methodInvokeInfo, declaringTypeHandle));
            }
        }
コード例 #8
0
 public MethodInvokerWithMethodInvokeInfo(MethodInvokeInfo methodInvokeInfo)
 {
     MethodInvokeInfo = methodInvokeInfo;
 }
コード例 #9
0
 public VirtualMethodInvoker(MethodInvokeInfo methodInvokeInfo, RuntimeTypeHandle declaringTypeHandle)
     : base(methodInvokeInfo)
 {
     _declaringTypeHandle = declaringTypeHandle;
 }
コード例 #10
0
 public StaticMethodInvoker(MethodInvokeInfo methodInvokeInfo)
     : base(methodInvokeInfo)
 {
 }
コード例 #11
0
 public StaticMethodInvoker(MethodInvokeInfo methodInvokeInfo)
     : base(methodInvokeInfo)
 {
 }
コード例 #12
0
 public VirtualMethodInvoker(MethodInvokeInfo methodInvokeInfo, RuntimeTypeHandle declaringTypeHandle)
     : base(methodInvokeInfo)
 {
     _declaringTypeHandle = declaringTypeHandle;
 }
コード例 #13
0
 public InstanceMethodInvoker(MethodInvokeInfo methodInvokeInfo, RuntimeTypeHandle declaringTypeHandle)
     : base(methodInvokeInfo)
 {
     _declaringTypeHandle = declaringTypeHandle;
 }
コード例 #14
0
ファイル: PackageUtility.cs プロジェクト: ewin66/uniframework
 /// <summary>
 /// 解码远程过程调用包
 /// </summary>
 /// <param name="package">The package.</param>
 /// <param name="encryptKey">The encrypt key.</param>
 /// <param name="invokeInfo">The invoke info.</param>
 public static void DecodeInvoke(NetworkInvokePackage package, string encryptKey, out MethodInvokeInfo invokeInfo, out object[] parameters)
 {
     invokeInfo = serializer.Deserialize <MethodInvokeInfo>(SecurityUtility.DESDecrypt((byte[])package.Context[METHOD_INVOKEINFO], encryptKey));
     parameters = serializer.Deserialize <object[]>(SecurityUtility.DESDecrypt((byte[])package.Context[METHOD_PARAMETERS], encryptKey));
 }
コード例 #15
0
 public MethodInvokerWithMethodInvokeInfo(MethodInvokeInfo methodInvokeInfo)
 {
     MethodInvokeInfo = methodInvokeInfo;
 }
コード例 #16
0
        //
        // Creates the appropriate flavor of Invoker depending on the calling convention "shape" (static, instance or virtual.)
        //
        internal static MethodInvoker CreateMethodInvoker(MetadataReader reader, RuntimeTypeHandle declaringTypeHandle, MethodHandle methodHandle, MethodInvokeInfo methodInvokeInfo)
        {
            Method           method           = methodHandle.GetMethod(reader);
            MethodAttributes methodAttributes = method.Flags;

            if (0 != (methodAttributes & MethodAttributes.Static))
            {
                return(new StaticMethodInvoker(methodInvokeInfo));
            }
            else if (methodInvokeInfo.VirtualResolveData != IntPtr.Zero)
            {
                return(new VirtualMethodInvoker(methodInvokeInfo, declaringTypeHandle));
            }
            else
            {
                return(new InstanceMethodInvoker(methodInvokeInfo, declaringTypeHandle));
            }
        }