/// <summary> /// Writes the named argument to the provided output stream. /// </summary> /// <param name="writer">The output stream.</param> /// <param name="provider">The object to use for obtaining metadata tokens for members in the tables stream.</param> public void Write(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)MemberType); TypeSignature.WriteFieldOrPropType(writer, ArgumentType); writer.WriteSerString(MemberName); Argument.Write(writer, provider); }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { if (!Validate()) { throw new InvalidOperationException(); } writer.WriteByte((byte)ElementType); BaseType.Write(writer, provider); writer.WriteCompressedUInt32((uint)Dimensions.Count); // Sized dimensions. var sizedDimensions = Dimensions .Where(x => x.Size.HasValue) .ToArray(); writer.WriteCompressedUInt32((uint)sizedDimensions.Length); foreach (var sizedDimension in sizedDimensions) { writer.WriteCompressedUInt32((uint)sizedDimension.Size.Value); } // Bounded dimensions. var boundedDimensions = Dimensions .Where(x => x.LowerBound.HasValue) .ToArray(); writer.WriteCompressedUInt32((uint)boundedDimensions.Length); foreach (var boundedDimension in boundedDimensions) { writer.WriteCompressedUInt32((uint)boundedDimension.LowerBound.Value); } }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)NativeType); writer.WriteSerString(Guid ?? string.Empty); writer.WriteSerString(NativeTypeName ?? string.Empty); writer.WriteSerString(MarshalType is null ? string.Empty : TypeNameBuilder.GetAssemblyQualifiedName(MarshalType)); writer.WriteSerString(Cookie ?? string.Empty); }
/// <inheritdoc /> public sealed override void Write(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { WriteContents(writer, provider); if (ExtraData != null) { writer.WriteBytes(ExtraData); } }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)NativeType); if (IidParameterIndex.HasValue) { writer.WriteCompressedUInt32((uint)IidParameterIndex.Value); } }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)Attributes); writer.WriteCompressedUInt32((uint)TypeArguments.Count); for (int i = 0; i < TypeArguments.Count; i++) { TypeArguments[i].Write(writer, provider); } }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)Attributes); writer.WriteCompressedUInt32((uint)VariableTypes.Count); foreach (var type in VariableTypes) { type.Write(writer, provider); } }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)ElementType); writer.WriteByte((byte)(IsValueType ? ElementType.ValueType : ElementType.Class)); TypeSignature.WriteTypeDefOrRef(writer, provider, GenericType); writer.WriteCompressedUInt32((uint)TypeArguments.Count); for (int i = 0; i < TypeArguments.Count; i++) { TypeArguments[i].Write(writer, provider); } }
/// <summary> /// Writes the fixed argument to the provided output stream. /// </summary> /// <param name="writer">The output stream.</param> /// <param name="provider">The object to use for obtaining metadata tokens for members in the tables stream.</param> public void Write(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { if (ArgumentType is SzArrayTypeSignature szArrayType) { WriteArray(szArrayType, writer, provider); } else { WriteSimple(writer, provider); } }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)Attributes); if (IsGeneric) { writer.WriteCompressedUInt32((uint)GenericParameterCount); } WriteParametersAndReturnType(writer, provider); }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)NativeType); if (Size.HasValue) { writer.WriteCompressedUInt32((uint)Size.Value); if (ArrayElementType.HasValue) { writer.WriteCompressedUInt32((uint)ArrayElementType); } } }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteUInt16(CustomAttributeSignaturePrologue); for (int i = 0; i < FixedArguments.Count; i++) { FixedArguments[i].Write(writer, provider); } writer.WriteUInt16((ushort)NamedArguments.Count); for (int i = 0; i < NamedArguments.Count; i++) { NamedArguments[i].Write(writer, provider); } }
/// <summary> /// Gets the index to the provided blob signature. If the signature is not present in the buffer, it will be /// appended to the end of the stream. /// </summary> /// <param name="provider">The object to use for obtaining metadata tokens for members in the tables stream.</param> /// <param name="signature">The signature to lookup or add.</param> /// <returns>The index of the signature.</returns> public uint GetBlobIndex(ITypeCodedIndexProvider provider, BlobSignature signature) { if (signature is null) { return(0u); } // Serialize blob. using var stream = new MemoryStream(); var writer = new BinaryStreamWriter(stream); signature.Write(writer, provider); return(GetBlobIndex(stream.ToArray())); }
/// <summary> /// Gets the index to the provided blob signature. If the signature is not present in the buffer, it will be /// appended to the end of the stream. /// </summary> /// <param name="provider">The object to use for obtaining metadata tokens for members in the tables stream.</param> /// <param name="signature">The signature to lookup or add.</param> /// <param name="diagnosticBag">The bag used to collect diagnostic information.</param> /// <returns>The index of the signature.</returns> public uint GetBlobIndex(ITypeCodedIndexProvider provider, BlobSignature signature, DiagnosticBag diagnosticBag) { if (signature is null) { return(0u); } // Serialize blob. using var stream = new MemoryStream(); var writer = new BinaryStreamWriter(stream); signature.Write(new BlobSerializationContext(writer, provider, diagnosticBag)); return(GetBlobIndex(stream.ToArray())); }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { var x = new MarshalAsAttribute(UnmanagedType.Bool); writer.WriteByte((byte)NativeType); writer.WriteByte((byte)ArrayElementType); if (ParameterIndex.HasValue) { writer.WriteCompressedUInt32((uint)ParameterIndex.Value); if (NumberOfElements.HasValue) { writer.WriteCompressedUInt32((uint)NumberOfElements.Value); if (Flags.HasValue) { writer.WriteCompressedUInt32((uint)Flags.Value); } } } }
/// <summary> /// Writes the security attribute to the provided output stream. /// </summary> /// <param name="writer">The output blob stream.</param> /// <param name="provider">The object to use for obtaining metadata tokens for members in the tables stream.</param> public void Write(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteSerString(TypeNameBuilder.GetAssemblyQualifiedName(AttributeType)); if (NamedArguments.Count == 0) { writer.WriteCompressedUInt32(1); writer.WriteCompressedUInt32(0); } else { using var subBlob = new MemoryStream(); var subWriter = new BinaryStreamWriter(subBlob); subWriter.WriteCompressedUInt32((uint)NamedArguments.Count); foreach (var argument in NamedArguments) { argument.Write(subWriter, provider); } writer.WriteCompressedUInt32((uint)subBlob.Length); writer.WriteBytes(subBlob.ToArray()); } }
/// <summary> /// Creates a new instance of the <see cref="BlobSerializationContext"/> class. /// </summary> /// <param name="writer">The output stream to write the raw data to.</param> /// <param name="indexProvider">The object responsible for obtaining coded indices to types.</param> /// <param name="errorListener">The object responsible for collecting diagnostic information during the serialization process.</param> public BlobSerializationContext(IBinaryStreamWriter writer, ITypeCodedIndexProvider indexProvider, IErrorListener errorListener) { Writer = writer ?? throw new ArgumentNullException(nameof(writer)); IndexProvider = indexProvider ?? throw new ArgumentNullException(nameof(indexProvider)); ErrorListener = errorListener ?? throw new ArgumentNullException(nameof(errorListener)); }
private void WriteSimple(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { Element.Write(writer, ArgumentType, provider); }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)NativeType); writer.WriteCompressedUInt32((uint)Size); }
internal static void WriteTypeDefOrRef(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider, ITypeDefOrRef type) { writer.WriteCompressedUInt32(provider.GetTypeDefOrRefIndex(type)); }
private void WriteArray(SzArrayTypeSignature szArrayType, IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { }
/// <summary> /// Serializes the blob to an output stream. /// </summary> /// <param name="writer">The output stream.</param> /// <param name="provider">The object to use for obtaining metadata tokens for members in the tables stream.</param> public abstract void Write(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider);
/// <summary> /// Writes the named argument to the provided output stream. /// </summary> /// <param name="writer">The output stream.</param> /// <param name="argumentType">The type of the argument.</param> /// <param name="provider">The object to use for obtaining metadata tokens for members in the tables stream.</param> public void Write(IBinaryStreamWriter writer, TypeSignature argumentType, ITypeCodedIndexProvider provider) { WriteValue(writer, argumentType, provider, Value); }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)Attributes); WriteParametersAndReturnType(writer, provider); }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)NativeType); }
/// <summary> /// Creates a new instance of the <see cref="BlobSerializationContext"/> class. /// </summary> /// <param name="writer">The output stream to write the raw data to.</param> /// <param name="indexProvider">The object responsible for obtaining coded indices to types.</param> /// <param name="diagnosticBag">The bag used to collect diagnostic information during the serialization process.</param> public BlobSerializationContext(IBinaryStreamWriter writer, ITypeCodedIndexProvider indexProvider, DiagnosticBag diagnosticBag) { Writer = writer ?? throw new ArgumentNullException(nameof(writer)); IndexProvider = indexProvider ?? throw new ArgumentNullException(nameof(indexProvider)); DiagnosticBag = diagnosticBag ?? throw new ArgumentNullException(nameof(diagnosticBag)); }
/// <summary> /// Serializes the blob (without extra data) to an output stream. /// </summary> /// <param name="writer">The output stream.</param> /// <param name="provider">The object to use for obtaining metadata tokens for members in the tables stream.</param> protected abstract void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider);
private void WriteValue(IBinaryStreamWriter writer, TypeSignature argumentType, ITypeCodedIndexProvider provider, object value) { if (argumentType.IsTypeOf("System", "Type")) { writer.WriteSerString(TypeNameBuilder.GetAssemblyQualifiedName((TypeSignature)value)); return; } switch (argumentType.ElementType) { case ElementType.Boolean: writer.WriteByte((byte)((bool)value ? 1 : 0)); break; case ElementType.Char: writer.WriteUInt16((char)value); break; case ElementType.I1: writer.WriteSByte((sbyte)value); break; case ElementType.U1: writer.WriteByte((byte)value); break; case ElementType.I2: writer.WriteInt16((short)value); break; case ElementType.U2: writer.WriteUInt16((ushort)value); break; case ElementType.I4: writer.WriteInt32((int)value); break; case ElementType.U4: writer.WriteUInt32((uint)value); break; case ElementType.I8: writer.WriteInt64((long)value); break; case ElementType.U8: writer.WriteUInt64((ulong)value); break; case ElementType.R4: writer.WriteSingle((float)value); break; case ElementType.R8: writer.WriteDouble((double)value); break; case ElementType.String: writer.WriteSerString(value as string); break; case ElementType.Object: var valueType = value.GetType(); var innerTypeSig = argumentType.Module.CorLibTypeFactory.FromName(valueType.Namespace, valueType.Name); TypeSignature.WriteFieldOrPropType(writer, innerTypeSig); WriteValue(writer, innerTypeSig, provider, value); break; case ElementType.Class: case ElementType.Enum: case ElementType.ValueType: var enumTypeDef = argumentType.Resolve(); if (enumTypeDef != null && enumTypeDef.IsEnum) { WriteValue(writer, enumTypeDef.GetEnumUnderlyingType(), provider, Value); } else { throw new NotImplementedException(); } break; default: throw new ArgumentOutOfRangeException(); } }
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) => writer.WriteByte((byte)ElementType);
/// <inheritdoc /> protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) { writer.WriteByte((byte)ElementType); writer.WriteCompressedUInt32(provider.GetTypeDefOrRefIndex(Type)); }