Beispiel #1
0
 public string ReadDocumentName(uint offset)
 {
     sb.Length = 0;
     using (var stream = blobStream.CreateStream(offset)) {
         int  sepCharsLength;
         var  sepChars = ReadSeparatorChar(stream, out sepCharsLength);
         bool needSep  = false;
         while (stream.Position < stream.Length)
         {
             if (needSep)
             {
                 sb.Append(sepChars, 0, sepCharsLength);
             }
             needSep = !(sepCharsLength == 1 && sepChars[0] == '\0');
             var part = ReadDocumentNamePart(stream.ReadCompressedUInt32());
             sb.Append(part);
             if (sb.Length > MAX_NAME_LENGTH)
             {
                 sb.Length = MAX_NAME_LENGTH;
                 break;
             }
         }
     }
     return(sb.ToString());
 }
        /// <inheritdoc />
        public IMetadata CreateMetadata()
        {
            // Create streams.
            var tablesStream      = TablesStream.CreateStream();
            var stringsStream     = StringsStream.CreateStream();
            var userStringsStream = UserStringsStream.CreateStream();
            var guidStream        = GuidStream.CreateStream();
            var blobStream        = BlobStream.CreateStream();

            // Update index sizes.
            tablesStream.StringIndexSize = stringsStream.IndexSize;
            tablesStream.GuidIndexSize   = guidStream.IndexSize;
            tablesStream.BlobIndexSize   = blobStream.IndexSize;

            // Create metadata directory.
            return(new PE.DotNet.Metadata.Metadata
            {
                VersionString = _versionString,
                Streams =
                {
                    tablesStream,
                    stringsStream,
                    userStringsStream,
                    guidStream,
                    blobStream
                }
            });
        }
Beispiel #3
0
        public void Read(uint imports, IList <PdbImport> result)
        {
            if (imports == 0)
            {
                return;
            }
            using (var stream = blobStream.CreateStream(imports)) {
                while (stream.Position < stream.Length)
                {
                    var           kind = ImportDefinitionKindUtils.ToPdbImportDefinitionKind(stream.ReadCompressedUInt32());
                    string        targetNamespace, alias;
                    AssemblyRef   targetAssembly;
                    PdbImport     import;
                    ITypeDefOrRef targetType;
                    switch (kind)
                    {
                    case PdbImportDefinitionKind.ImportNamespace:
                        // <import> ::= ImportNamespace <target-namespace>
                        targetNamespace = ReadUTF8(stream.ReadCompressedUInt32());
                        import          = new PdbImportNamespace(targetNamespace);
                        break;

                    case PdbImportDefinitionKind.ImportAssemblyNamespace:
                        // <import> ::= ImportAssemblyNamespace <target-assembly> <target-namespace>
                        targetAssembly  = TryReadAssemblyRef(stream.ReadCompressedUInt32());
                        targetNamespace = ReadUTF8(stream.ReadCompressedUInt32());
                        import          = new PdbImportAssemblyNamespace(targetAssembly, targetNamespace);
                        break;

                    case PdbImportDefinitionKind.ImportType:
                        // <import> ::= ImportType <target-type>
                        targetType = TryReadType(stream.ReadCompressedUInt32());
                        import     = new PdbImportType(targetType);
                        break;

                    case PdbImportDefinitionKind.ImportXmlNamespace:
                        // <import> ::= ImportXmlNamespace <alias> <target-namespace>
                        alias           = ReadUTF8(stream.ReadCompressedUInt32());
                        targetNamespace = ReadUTF8(stream.ReadCompressedUInt32());
                        import          = new PdbImportXmlNamespace(alias, targetNamespace);
                        break;

                    case PdbImportDefinitionKind.ImportAssemblyReferenceAlias:
                        // <import> ::= ImportReferenceAlias <alias>
                        alias  = ReadUTF8(stream.ReadCompressedUInt32());
                        import = new PdbImportAssemblyReferenceAlias(alias);
                        break;

                    case PdbImportDefinitionKind.AliasAssemblyReference:
                        // <import> ::= AliasAssemblyReference <alias> <target-assembly>
                        alias          = ReadUTF8(stream.ReadCompressedUInt32());
                        targetAssembly = TryReadAssemblyRef(stream.ReadCompressedUInt32());
                        import         = new PdbAliasAssemblyReference(alias, targetAssembly);
                        break;

                    case PdbImportDefinitionKind.AliasNamespace:
                        // <import> ::= AliasNamespace <alias> <target-namespace>
                        alias           = ReadUTF8(stream.ReadCompressedUInt32());
                        targetNamespace = ReadUTF8(stream.ReadCompressedUInt32());
                        import          = new PdbAliasNamespace(alias, targetNamespace);
                        break;

                    case PdbImportDefinitionKind.AliasAssemblyNamespace:
                        // <import> ::= AliasAssemblyNamespace <alias> <target-assembly> <target-namespace>
                        alias           = ReadUTF8(stream.ReadCompressedUInt32());
                        targetAssembly  = TryReadAssemblyRef(stream.ReadCompressedUInt32());
                        targetNamespace = ReadUTF8(stream.ReadCompressedUInt32());
                        import          = new PdbAliasAssemblyNamespace(alias, targetAssembly, targetNamespace);
                        break;

                    case PdbImportDefinitionKind.AliasType:
                        // <import> ::= AliasType <alias> <target-type>
                        alias      = ReadUTF8(stream.ReadCompressedUInt32());
                        targetType = TryReadType(stream.ReadCompressedUInt32());
                        import     = new PdbAliasType(alias, targetType);
                        break;

                    case ImportDefinitionKindUtils.UNKNOWN_IMPORT_KIND:
                        import = null;
                        break;

                    default:
                        Debug.Fail("Unknown import definition kind: " + kind.ToString());
                        import = null;
                        break;
                    }
                    if (import != null)
                    {
                        result.Add(import);
                    }
                }
                Debug.Assert(stream.Position == stream.Length);
            }
        }