/// <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);
 }
示例#4
0
 /// <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);
     }
 }
示例#7
0
        /// <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);
 }
示例#19
0
 /// <inheritdoc />
 protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider)
 {
     writer.WriteByte((byte)NativeType);
     writer.WriteCompressedUInt32((uint)Size);
 }
示例#20
0
 internal static void WriteTypeDefOrRef(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider, ITypeDefOrRef type)
 {
     writer.WriteCompressedUInt32(provider.GetTypeDefOrRefIndex(type));
 }
 private void WriteArray(SzArrayTypeSignature szArrayType, IBinaryStreamWriter writer,
                         ITypeCodedIndexProvider provider)
 {
 }
示例#22
0
 /// <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);
示例#23
0
 /// <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);
 }
示例#26
0
 /// <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));
 }
示例#27
0
 /// <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);
示例#28
0
        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();
            }
        }
示例#29
0
 /// <inheritdoc />
 protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider) =>
 writer.WriteByte((byte)ElementType);
示例#30
0
 /// <inheritdoc />
 protected override void WriteContents(IBinaryStreamWriter writer, ITypeCodedIndexProvider provider)
 {
     writer.WriteByte((byte)ElementType);
     writer.WriteCompressedUInt32(provider.GetTypeDefOrRefIndex(Type));
 }