Ejemplo n.º 1
0
        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);
            }
        }