Exemple #1
0
        public override MetadataStream CreateStream()
        {
            using (var stream = new MemoryStream())
            {
                var writer = new BinaryStreamWriter(stream);
                writer.WriteByte(0);

                var processedSignatures = new HashSet <BlobSignature>();
                var agenda = new Queue <BlobSignature>(_signatureOffsetMapping.Keys);

                while (agenda.Count > 0)
                {
                    var signature = agenda.Dequeue();
                    if (processedSignatures.Add(signature))
                    {
                        writer.WriteCompressedUInt32(signature.GetPhysicalLength());

                        int count = _signatureOffsetMapping.Count;
                        signature.Write(_parentBuffer, writer);

                        // TODO: find more efficient way of adding newly created signatures to the queue.
                        if (count != _signatureOffsetMapping.Count)
                        {
                            foreach (var sig in _signatureOffsetMapping.Keys)
                            {
                                agenda.Enqueue(sig);
                            }
                        }
                    }
                }

                writer.WriteZeroes((int)(FileSegment.Align(_length, 4) - _length));
                return(new BlobStream(new MemoryStreamReader(stream.ToArray())));
            }
        }
        private uint AppendBlob(byte[] blob)
        {
            uint offset = (uint)_rawStream.Length;

            _writer.WriteCompressedUInt32((uint)blob.Length);
            AppendRawData(blob);
            return(offset);
        }
        public override MetadataStream CreateStream()
        {
            using (var stream = new MemoryStream())
            {
                var writer = new BinaryStreamWriter(stream);
                writer.WriteByte(0);

                foreach (var value in _stringOffsetMapping.Keys)
                {
                    writer.WriteCompressedUInt32((uint)Encoding.Unicode.GetByteCount(value) + 1);
                    writer.WriteBytes(Encoding.Unicode.GetBytes(value));
                    writer.WriteByte(0);
                }

                return(new UserStringStream(new MemoryStreamReader(stream.ToArray())));
            }
        }
Exemple #4
0
        public override MetadataStream CreateStream()
        {
            using (var stream = new MemoryStream())
            {
                var writer = new BinaryStreamWriter(stream);
                writer.WriteByte(0);

                foreach (var signature in _signatureOffsetMapping.Keys)
                {
                    writer.WriteCompressedUInt32(signature.GetPhysicalLength(_parentBuffer));
                    signature.Write(_parentBuffer, writer);
                }

                writer.WriteZeroes((int)(FileSegment.Align(_length, 4) - _length));
                return(new BlobStream(new MemoryStreamReader(stream.ToArray())));
            }
        }
        private uint AppendString(string value)
        {
            uint offset = (uint)_rawStream.Length;

            if (value is null)
            {
                _writer.WriteByte(0);
                return(offset);
            }

            int byteCount = Encoding.Unicode.GetByteCount(value) + 1;

            _writer.WriteCompressedUInt32((uint)byteCount);

            var rawData = new byte[byteCount];

            Encoding.Unicode.GetBytes(value, 0, value.Length, rawData, 0);
            rawData[byteCount - 1] = GetTerminatorByte(value);

            AppendRawData(rawData);
            return(offset);
        }
        /// <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());
            }
        }