internal static void SetFieldMarshal(this IHasFieldMarshal owner, LazyValue <FieldMarshal> container, FieldMarshal newValue) { if (newValue != null && newValue.Parent != null) { throw new InvalidOperationException("Field marshal is already added to another member."); } if (container.Value != null) { container.Value.Parent = null; } container.Value = newValue; if (newValue != null) { newValue.Parent = owner; } }
private void AddFieldMarshal(MetadataToken ownerToken, IHasFieldMarshal owner) { if (owner.MarshalDescriptor is null) { return; } var table = Metadata.TablesStream.GetSortedTable <IHasFieldMarshal, FieldMarshalRow>(TableIndex.FieldMarshal); var encoder = Metadata.TablesStream.GetIndexEncoder(CodedIndex.HasFieldMarshal); var row = new FieldMarshalRow( encoder.EncodeToken(ownerToken), Metadata.BlobStream.GetBlobIndex(this, owner.MarshalDescriptor, DiagnosticBag)); table.Add(owner, row); }
void CopyMarshalType(IHasFieldMarshal source, IHasFieldMarshal dest) { if (!source.HasMarshalType) { return; } switch (source.MarshalType) { case SafeArrayMarshalType s: dest.MarshalType = new SafeArrayMarshalType(s.VariantType, Importer.Import(s.UserDefinedSubType)); break; case CustomMarshalType s: dest.MarshalType = new CustomMarshalType(s.Guid, s.NativeTypeName, Importer.Import(s.CustomMarshaler), s.Cookie); break; default: dest.MarshalType = source.MarshalType; break; } }
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); }