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))); }
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)); }
/// <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); }
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); }
public int GetHashCode(MarshalDescriptor obj) { return(obj.GetHashCode()); }
public FieldMarshal(MarshalDescriptor marshalDescriptor) : base(new MetadataToken(MetadataTokenType.FieldMarshal)) { _parent = new LazyValue <IHasFieldMarshal>(); _marshalDescriptor = new LazyValue <MarshalDescriptor>(marshalDescriptor); }
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); }