/// <summary> /// Serializes metadata root content into the given <see cref="BlobBuilder"/>. /// </summary> /// <param name="builder">Builder to write to.</param> /// <param name="methodBodyStreamRva"> /// The relative virtual address of the start of the method body stream. /// Used to calculate the final value of RVA fields of MethodDef table. /// </param> /// <param name="mappedFieldDataStreamRva"> /// The relative virtual address of the start of the field init data stream. /// Used to calculate the final value of RVA fields of FieldRVA table. /// </param> /// <exception cref="ArgumentNullException"><paramref name="builder"/> is null.</exception> /// <exception cref="ArgumentOutOfRangeException"><paramref name="methodBodyStreamRva"/> or <paramref name="mappedFieldDataStreamRva"/> is negative.</exception> /// <exception cref="InvalidOperationException"> /// A metadata table is not ordered as required by the specification and <see cref="SuppressValidation"/> is false. /// </exception> public void Serialize(BlobBuilder builder, int methodBodyStreamRva, int mappedFieldDataStreamRva) { if (builder == null) { Throw.ArgumentNull(nameof(builder)); } if (methodBodyStreamRva < 0) { Throw.ArgumentOutOfRange(nameof(methodBodyStreamRva)); } if (mappedFieldDataStreamRva < 0) { Throw.ArgumentOutOfRange(nameof(mappedFieldDataStreamRva)); } if (!SuppressValidation) { _tablesAndHeaps.ValidateOrder(); } // header: MetadataBuilder.SerializeMetadataHeader(builder, MetadataVersion, _serializedMetadata.Sizes); // #~ or #- stream: _tablesAndHeaps.SerializeMetadataTables(builder, _serializedMetadata.Sizes, _serializedMetadata.StringMap, methodBodyStreamRva, mappedFieldDataStreamRva); // #Strings, #US, #Guid and #Blob streams: _tablesAndHeaps.WriteHeapsTo(builder, _serializedMetadata.StringHeap); }
/// <summary> /// Serializes Portable PDB content into the given <see cref="BlobBuilder"/>. /// </summary> /// <param name="builder">Builder to write to.</param> /// <returns>The id of the serialized content.</returns> /// <exception cref="ArgumentNullException"><paramref name="builder"/> is null.</exception> public BlobContentId Serialize(BlobBuilder builder) { if (builder == null) { Throw.ArgumentNull(nameof(builder)); } // header: MetadataBuilder.SerializeMetadataHeader(builder, MetadataVersion, _serializedMetadata.Sizes); // #Pdb stream SerializeStandalonePdbStream(builder); // #~ or #- stream: _builder.SerializeMetadataTables(builder, _serializedMetadata.Sizes, _serializedMetadata.StringMap, methodBodyStreamRva: 0, mappedFieldDataStreamRva: 0); // #Strings, #US, #Guid and #Blob streams: _builder.WriteHeapsTo(builder, _serializedMetadata.StringHeap); var contentId = IdProvider(builder.GetBlobs()); // fill in the id: var idWriter = new BlobWriter(_pdbIdBlob); idWriter.WriteGuid(contentId.Guid); idWriter.WriteUInt32(contentId.Stamp); Debug.Assert(idWriter.RemainingBytes == 0); return(contentId); }