internal void WriteMetadata(MetadataWriter mw) { mw.Write(0x424A5342); // Signature ("BSJB") mw.Write((ushort)1); // MajorVersion mw.Write((ushort)1); // MinorVersion mw.Write(0); // Reserved byte[] version = StringToPaddedUTF8(asm.ImageRuntimeVersion); mw.Write(version.Length); // Length mw.Write(version); mw.Write((ushort)0); // Flags // #Blob is the only optional heap if (Blobs.IsEmpty) { mw.Write((ushort)4); // Streams } else { mw.Write((ushort)5); // Streams } int offset = GetHeaderLength(); // Streams mw.Write(offset); // Offset mw.Write(Tables.Length); // Size mw.Write(StringToPaddedUTF8("#~")); offset += Tables.Length; mw.Write(offset); // Offset mw.Write(Strings.Length); // Size mw.Write(StringToPaddedUTF8("#Strings")); offset += Strings.Length; mw.Write(offset); // Offset mw.Write(UserStrings.Length); // Size mw.Write(StringToPaddedUTF8("#US")); offset += UserStrings.Length; mw.Write(offset); // Offset mw.Write(Guids.Length); // Size mw.Write(StringToPaddedUTF8("#GUID")); offset += Guids.Length; if (!Blobs.IsEmpty) { mw.Write(offset); // Offset mw.Write(Blobs.Length); // Size mw.Write(StringToPaddedUTF8("#Blob")); } Tables.Write(mw); Strings.Write(mw); UserStrings.Write(mw); Guids.Write(mw); if (!Blobs.IsEmpty) { Blobs.Write(mw); } }