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