internal static MethodSignatureDescriptor ExtractMethodSignature(SignatureBlob methodSignatureBlob, MetadataOnlyModule resolver, GenericContext context) { byte[] signatureAsByteArray = methodSignatureBlob.GetSignatureAsByteArray(); int num = 0; MethodSignatureDescriptor methodSignatureDescriptor = new MethodSignatureDescriptor() { ReturnParameter = new TypeSignatureDescriptor(), GenericParameterCount = 0, CallingConvention = SignatureUtil.ExtractCallingConvention(signatureAsByteArray, ref num) }; bool callingConvention = (methodSignatureDescriptor.CallingConvention & Microsoft.MetadataReader.CorCallingConvention.ExplicitThis) != Microsoft.MetadataReader.CorCallingConvention.Default; if ((methodSignatureDescriptor.CallingConvention & Microsoft.MetadataReader.CorCallingConvention.Generic) != Microsoft.MetadataReader.CorCallingConvention.Default) { int num1 = SignatureUtil.ExtractInt(signatureAsByteArray, ref num); if (num1 <= 0) { CultureInfo invariantCulture = CultureInfo.InvariantCulture; object[] invalidMetadataSignature = new object[] { MetadataStringTable.InvalidMetadataSignature, MetadataStringTable.ExpectedPositiveNumberOfGenericParameters }; throw new ArgumentException(string.Format(invariantCulture, "{0} {1}", invalidMetadataSignature)); } context = context.VerifyAndUpdateMethodArguments(num1); methodSignatureDescriptor.GenericParameterCount = num1; } int num2 = SignatureUtil.ExtractInt(signatureAsByteArray, ref num); bool flag = false; CustomModifiers customModifier = SignatureUtil.ExtractCustomModifiers(signatureAsByteArray, ref num, resolver, context); methodSignatureDescriptor.ReturnParameter = SignatureUtil.ExtractType(signatureAsByteArray, ref num, resolver, context, flag); methodSignatureDescriptor.ReturnParameter.CustomModifiers = customModifier; if (callingConvention) { SignatureUtil.ExtractType(signatureAsByteArray, ref num, resolver, context); num2--; } methodSignatureDescriptor.Parameters = new TypeSignatureDescriptor[num2]; for (int i = 0; i < num2; i++) { customModifier = SignatureUtil.ExtractCustomModifiers(signatureAsByteArray, ref num, resolver, context); methodSignatureDescriptor.Parameters[i] = SignatureUtil.ExtractType(signatureAsByteArray, ref num, resolver, context, flag); methodSignatureDescriptor.Parameters[i].CustomModifiers = customModifier; } if (num != (int)signatureAsByteArray.Length) { CultureInfo cultureInfo = CultureInfo.InvariantCulture; object[] objArray = new object[] { MetadataStringTable.InvalidMetadataSignature, MetadataStringTable.ExtraInformationAfterLastParameter }; throw new ArgumentException(string.Format(cultureInfo, "{0} {1}", objArray)); } return(methodSignatureDescriptor); }
public MetadataOnlyFieldInfo(MetadataOnlyModule resolver, Token fieldDefToken, Type[] typeArgs, Type[] methodArgs) { int num; EmbeddedBlobPointer embeddedBlobPointer; int num1; int num2; IntPtr intPtr; int num3; FieldAttributes fieldAttribute; this.m_resolver = resolver; this.m_fieldDefToken = fieldDefToken; if (typeArgs != null || methodArgs != null) { this.m_context = new GenericContext(typeArgs, methodArgs); } IMetadataImport rawImport = this.m_resolver.RawImport; StringBuilder stringBuilder = new StringBuilder(256); rawImport.GetFieldProps(this.m_fieldDefToken, out this.m_declaringClassToken, null, 0, out num, out fieldAttribute, out embeddedBlobPointer, out num1, out num2, out intPtr, out num3); this.m_attrib = fieldAttribute; stringBuilder.Capacity = num; rawImport.GetFieldProps(this.m_fieldDefToken, out this.m_declaringClassToken, stringBuilder, num, out num, out fieldAttribute, out embeddedBlobPointer, out num1, out num2, out intPtr, out num3); this.m_attrib = fieldAttribute; this.m_name = stringBuilder.ToString(); byte[] numArray = this.m_resolver.ReadEmbeddedBlob(embeddedBlobPointer, num1); int num4 = 0; SignatureUtil.ExtractCallingConvention(numArray, ref num4); this.m_customModifiers = SignatureUtil.ExtractCustomModifiers(numArray, ref num4, this.m_resolver, this.m_context); if (this.m_resolver.RawImport.IsValidToken((uint)this.m_declaringClassToken)) { Type type = this.m_resolver.ResolveType(this.m_declaringClassToken); if (type.IsGenericType && (this.m_context == null || this.m_context.TypeArgs == null || (int)this.m_context.TypeArgs.Length == 0)) { if (this.m_context != null) { this.m_context = new GenericContext(type.GetGenericArguments(), this.m_context.MethodArgs); } else { this.m_context = new GenericContext(type.GetGenericArguments(), null); } } } this.m_fieldType = SignatureUtil.ExtractType(numArray, ref num4, this.m_resolver, this.m_context); }
internal MetadataOnlyParameterInfo(MetadataOnlyModule resolver, Token parameterToken, Type paramType, CustomModifiers customModifiers) { uint num; uint num1; uint num2; uint num3; uint num4; UnusedIntPtr unusedIntPtr; this.m_resolver = resolver; this.m_parameterToken = parameterToken; this.m_paramType = paramType; this.m_customModifiers = customModifiers; IMetadataImport rawImport = this.m_resolver.RawImport; rawImport.GetParamProps(this.m_parameterToken, out this.m_parentMemberToken, out num, null, 0, out num4, out num1, out num2, out unusedIntPtr, out num3); StringBuilder stringBuilder = new StringBuilder((int)num4); rawImport.GetParamProps(this.m_parameterToken, out this.m_parentMemberToken, out num, stringBuilder, (uint)stringBuilder.Capacity, out num4, out num1, out num2, out unusedIntPtr, out num3); this.m_name = stringBuilder.ToString(); this.m_position = (int)(num - 1); this.m_attrib = (ParameterAttributes)num1; }