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