コード例 #1
0
        void CreateStream(string name)
        {
            MetadataStream stream = new MetadataStream();

            stream.Header.Name = name;
            stream.Heap        = MetadataHeap.HeapFactory(stream);
            m_root.Streams.Add(stream);
        }
コード例 #2
0
        public override void VisitMetadataStreamCollection(MetadataStreamCollection coll)
        {
            MetadataStream tables = new MetadataStream();

            tables.Header.Name = MetadataStream.Tables;
            tables.Heap        = MetadataHeap.HeapFactory(tables);
            TablesHeap th = tables.Heap as TablesHeap;

            th.Tables = new TableCollection(th);
            m_root.Streams.Add(tables);
        }
コード例 #3
0
        public override void VisitMetadataStreamHeader(MetadataStream.MetadataStreamHeader header)
        {
            header.Offset = m_binaryReader.ReadUInt32();
            header.Size   = m_binaryReader.ReadUInt32();

            StringBuilder buffer = new StringBuilder();

            while (true)
            {
                char cur = (char)m_binaryReader.ReadSByte();
                if (cur == '\0')
                {
                    break;
                }
                buffer.Append(cur);
            }
            header.Name = buffer.ToString();
            if (header.Name.Length == 0)
            {
                throw new MetadataFormatException("Invalid stream name");
            }

            long rootpos = m_root.GetImage().ResolveVirtualAddress(
                m_root.GetImage().CLIHeader.Metadata.VirtualAddress);

            long curpos = m_binaryReader.BaseStream.Position;

            if (header.Size != 0)
            {
                curpos -= rootpos;
            }

            curpos += 3;
            curpos &= ~3;

            if (header.Size != 0)
            {
                curpos += rootpos;
            }

            m_binaryReader.BaseStream.Position = curpos;

            header.Stream.Heap = MetadataHeap.HeapFactory(header.Stream);
        }