// // 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); }
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); }
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; } } }
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); }
public InstanceMethodInvoker(MethodInvokeInfo methodInvokeInfo, RuntimeTypeHandle declaringTypeHandle) : base(methodInvokeInfo) { _declaringTypeHandle = declaringTypeHandle; }
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; } } }
// // 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)); } }
public MethodInvokerWithMethodInvokeInfo(MethodInvokeInfo methodInvokeInfo) { MethodInvokeInfo = methodInvokeInfo; }
public VirtualMethodInvoker(MethodInvokeInfo methodInvokeInfo, RuntimeTypeHandle declaringTypeHandle) : base(methodInvokeInfo) { _declaringTypeHandle = declaringTypeHandle; }
public StaticMethodInvoker(MethodInvokeInfo methodInvokeInfo) : base(methodInvokeInfo) { }
/// <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)); }
// // 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)); } }