コード例 #1
0
ファイル: SignatureUtil.cs プロジェクト: radtek/Shopdrawing
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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;
        }