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()))); } }
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()); } }