Esempio n. 1
0
        internal FieldMarshal(MetadataHeader header, MetadataToken token, MetadataRow <uint, uint> row)
            : base(header, token, row)
        {
            var tableStream = header.GetStream <TableStream>();
            var blobStream  = header.GetStream <BlobStream>();

            _parent = new LazyValue <IHasFieldMarshal>(() =>
            {
                var parentToken = tableStream.GetIndexEncoder(CodedIndex.HasFieldMarshal).DecodeIndex(row.Column1);
                return(parentToken.Rid != 0 ? (IHasFieldMarshal)tableStream.ResolveMember(parentToken) : null);
            });

            _marshalDescriptor = new LazyValue <MarshalDescriptor>(() =>
                                                                   MarshalDescriptor.FromReader(blobStream.CreateBlobReader(row.Column2)));
        }
Esempio n. 2
0
        internal FieldMarshal(MetadataImage image, MetadataRow <uint, uint> row)
            : base(row.MetadataToken)
        {
            _image  = image;
            _parent = new LazyValue <IHasFieldMarshal>(() =>
            {
                var tableStream = image.Header.GetStream <TableStream>();
                var parentToken = tableStream.GetIndexEncoder(CodedIndex.HasFieldMarshal).DecodeIndex(row.Column1);
                return(tableStream.TryResolveRow(parentToken, out var parentRow)
                    ? (IHasFieldMarshal)tableStream.GetTable(parentToken.TokenType).GetMemberFromRow(image, parentRow)
                    : null);
            });

            _marshalDescriptor = new LazyValue <MarshalDescriptor>(() =>
                                                                   MarshalDescriptor.FromReader(image.Header.GetStream <BlobStream>().CreateBlobReader(row.Column2), true));
        }
Esempio n. 3
0
        /// <summary>
        /// Reads a marshal descriptor signature from the provided input stream.
        /// </summary>
        /// <param name="parentModule">The module that defines the marshal descriptor</param>
        /// <param name="reader">The input stream.</param>
        /// <returns>The marshal descriptor.</returns>
        public static MarshalDescriptor FromReader(ModuleDefinition parentModule, IBinaryStreamReader reader)
        {
            var nativeType = (NativeType)reader.ReadByte();
            MarshalDescriptor descriptor = nativeType switch
            {
                NativeType.SafeArray => SafeArrayMarshalDescriptor.FromReader(parentModule, reader),
                NativeType.FixedArray => FixedArrayMarshalDescriptor.FromReader(reader),
                NativeType.LPArray => LPArrayMarshalDescriptor.FromReader(reader),
                NativeType.CustomMarshaller => CustomMarshalDescriptor.FromReader(parentModule, reader),
                NativeType.FixedSysString => FixedSysStringMarshalDescriptor.FromReader(reader),
                NativeType.Interface => ComInterfaceMarshalDescriptor.FromReader(nativeType, reader),
                NativeType.IDispatch => ComInterfaceMarshalDescriptor.FromReader(nativeType, reader),
                NativeType.IUnknown => ComInterfaceMarshalDescriptor.FromReader(nativeType, reader),
                _ => new SimpleMarshalDescriptor(nativeType)
            };

            descriptor.ExtraData = reader.ReadToEnd();
            return(descriptor);
        }
        internal MarshalDescriptor GetFieldMarshal(MetadataToken ownerToken)
        {
            var metadata = DotNetDirectory.Metadata;
            var table    = metadata
                           .GetStream <TablesStream>()
                           .GetTable <FieldMarshalRow>(TableIndex.FieldMarshal);

            uint rid = GetFieldMarshalRid(ownerToken);

            if (table.TryGetByRid(rid, out var row))
            {
                var reader = metadata
                             .GetStream <BlobStream>()
                             .GetBlobReaderByIndex(row.NativeType);
                return(MarshalDescriptor.FromReader(this, reader));
            }

            return(null);
        }
Esempio n. 5
0
        public bool Equals(MarshalDescriptor x, MarshalDescriptor y)
        {
            var array = x as ArrayMarshalDescriptor;

            if (array != null)
            {
                return(Equals(array, y as ArrayMarshalDescriptor));
            }

            var custom = x as CustomMarshalDescriptor;

            if (custom != null)
            {
                return(Equals(custom, y as CustomMarshalDescriptor));
            }

            var fixedArray = x as FixedArrayMarshalDescriptor;

            if (fixedArray != null)
            {
                return(Equals(fixedArray, y as FixedArrayMarshalDescriptor));
            }

            var safe = x as SafeArrayMarshalDescriptor;

            if (safe != null)
            {
                return(Equals(safe, y as SafeArrayMarshalDescriptor));
            }

            var simple = x as SimpleMarshalDescriptor;

            if (simple != null)
            {
                return(Equals(simple, y as SimpleMarshalDescriptor));
            }

            return(false);
        }
Esempio n. 6
0
 public int GetHashCode(MarshalDescriptor obj)
 {
     return(obj.GetHashCode());
 }
Esempio n. 7
0
 public FieldMarshal(MarshalDescriptor marshalDescriptor)
     : base(new MetadataToken(MetadataTokenType.FieldMarshal))
 {
     _parent            = new LazyValue <IHasFieldMarshal>();
     _marshalDescriptor = new LazyValue <MarshalDescriptor>(marshalDescriptor);
 }
Esempio n. 8
0
 public FieldMarshal(IHasFieldMarshal parent, MarshalDescriptor marshalDescriptor)
     : base(null, new MetadataToken(MetadataTokenType.FieldMarshal), new MetadataRow <uint, uint>())
 {
     _parent            = new LazyValue <IHasFieldMarshal>(parent);
     _marshalDescriptor = new LazyValue <MarshalDescriptor>(marshalDescriptor);
 }