예제 #1
0
        internal MethodDefinition(MetadataImage image, MetadataRow <FileSegment, MethodImplAttributes, MethodAttributes, uint, uint, uint> row)
            : base(row.MetadataToken)
        {
            _image = image;
            var stringStream = image.Header.GetStream <StringStream>();
            var blobStream   = image.Header.GetStream <BlobStream>();

            ImplAttributes = row.Column2;
            Attributes     = row.Column3;
            _name          = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column4));

            IBinaryStreamReader blobReader;

            if (blobStream.TryCreateBlobReader(row.Column5, out blobReader))
            {
                _signature = new LazyValue <MethodSignature>(() => MethodSignature.FromReader(image, blobReader));
            }

            _methodBody = new LazyValue <MethodBody>(() =>
            {
                var rawBody = row.Column1 as CilRawMethodBody;
                if (rawBody != null)
                {
                    return(CilMethodBody.FromRawMethodBody(this, rawBody));
                }

                // TODO: handler for native methods.
                return(null);
            });

            _declaringType = new LazyValue <TypeDefinition>(() =>
            {
                var table   = image.Header.GetStream <TableStream>().GetTable(MetadataTokenType.TypeDef);
                var typeRow = table.GetRowClosestToKey(5, row.MetadataToken.Rid);
                return((TypeDefinition)table.GetMemberFromRow(image, typeRow));
            });

            _pinvokeMap = new LazyValue <ImplementationMap>(() =>
            {
                if (!row.Column3.HasFlag(MethodAttributes.PInvokeImpl))
                {
                    return(null);
                }

                var table  = (ImplementationMapTable)image.Header.GetStream <TableStream>().GetTable(MetadataTokenType.ImplMap);
                var mapRow = table.FindImplementationMapOfOwner(row.MetadataToken);
                return(mapRow != null ? (ImplementationMap)table.GetMemberFromRow(image, mapRow) : null);
            });

            Parameters = new RangedMemberCollection <MethodDefinition, ParameterDefinition>(this, MetadataTokenType.Param, 5, GetParamOwner, SetParamOwner);

            CustomAttributes     = new CustomAttributeCollection(this);
            SecurityDeclarations = new SecurityDeclarationCollection(this);
            GenericParameters    = new GenericParameterCollection(this);
        }
예제 #2
0
        internal MethodDefinition(MetadataHeader header, MetadataToken token, MetadataRow <uint, ushort, ushort, uint, uint, uint> row)
            : base(header, token, row)
        {
            var stringStream = header.GetStream <StringStream>();
            var blobStream   = header.GetStream <BlobStream>();

            Rva            = row.Column1;
            ImplAttributes = (MethodImplAttributes)row.Column2;
            Attributes     = (MethodAttributes)row.Column3;
            _name          = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column4));

            IBinaryStreamReader blobReader;

            if (blobStream.TryCreateBlobReader(row.Column5, out blobReader))
            {
                _signature = new LazyValue <MethodSignature>(() => MethodSignature.FromReader(header, blobReader));
            }
        }
예제 #3
0
 /// <inheritdoc />
 protected override MethodSignature GetSignature() => MethodSignature.FromReader(_parentModule,
                                                                                 _parentModule.DotNetDirectory.Metadata
                                                                                 .GetStream <BlobStream>()
                                                                                 .GetBlobReaderByIndex(_row.Signature));