private static unsafe MetadataReaderProvider TryOpenReaderForInMemoryPdb(IntPtr inMemoryPdbAddress, int inMemoryPdbSize) { Debug.Assert(inMemoryPdbAddress != IntPtr.Zero); // quick check to avoid throwing exceptions below in common cases: const uint ManagedMetadataSignature = 0x424A5342; if (inMemoryPdbSize < sizeof(uint) || *(uint *)inMemoryPdbAddress != ManagedMetadataSignature) { // not a Portable PDB return(null); } var provider = MetadataReaderProvider.FromMetadataImage((byte *)inMemoryPdbAddress, inMemoryPdbSize); try { // may throw if the metadata is invalid provider.GetMetadataReader(); return(provider); } catch (BadImageFormatException) { provider.Dispose(); return(null); } }
private string ReadVersion(BlobBuilder metadata) { using (var provider = MetadataReaderProvider.FromMetadataImage(metadata.ToImmutableArray())) { return(provider.GetMetadataReader().MetadataVersion); } }
private unsafe static OpenedReader TryOpenReaderForInMemoryPdb(IntPtr inMemoryPdbAddress, int inMemoryPdbSize) { Debug.Assert(inMemoryPdbAddress != IntPtr.Zero); // quick check to avoid throwing exceptions below in common cases: const uint ManagedMetadataSignature = 0x424A5342; if (inMemoryPdbSize < sizeof(uint) || *(uint *)inMemoryPdbAddress != ManagedMetadataSignature) { // not a Portable PDB return(null); } OpenedReader result = null; MetadataReaderProvider provider = null; try { provider = MetadataReaderProvider.FromMetadataImage((byte *)inMemoryPdbAddress, inMemoryPdbSize); result = new OpenedReader(provider, provider.GetMetadataReader()); } catch (BadImageFormatException) { return(null); } finally { if (result == null) { provider?.Dispose(); } } return(result); }
public unsafe void FromMetadataImage_BadArgs() { Assert.Throws <ArgumentNullException>(() => MetadataReaderProvider.FromMetadataImage(null, 10)); Assert.Throws <ArgumentOutOfRangeException>(() => { fixed(byte *p = new byte[] { 0 }) MetadataReaderProvider.FromMetadataImage(p, -1); }); Assert.Throws <ArgumentNullException>(() => MetadataReaderProvider.FromMetadataImage(default(ImmutableArray <byte>))); }
// This has to be a service and be cached public static MetadataReader CreateMetadataReader(this ClrModule module) { if (module.MetadataAddress == 0) { return(null); } var d = new byte[module.MetadataLength]; module.Runtime.ReadMemory(module.MetadataAddress, d, d.Length, out var read); return(MetadataReaderProvider.FromMetadataImage(ImmutableArray.Create(d, 0, read)).GetMetadataReader()); }
public void GetOrAddDocumentName2() { var mdBuilder = new MetadataBuilder(); mdBuilder.AddModule(0, default(StringHandle), default(GuidHandle), default(GuidHandle), default(GuidHandle)); var n1 = mdBuilder.GetOrAddDocumentName(""); var n2 = mdBuilder.GetOrAddDocumentName("/a/b/c"); var n3 = mdBuilder.GetOrAddDocumentName(@"\a\b\cc"); var n4 = mdBuilder.GetOrAddDocumentName(@"/a/b\c"); var n5 = mdBuilder.GetOrAddDocumentName(@"/\a/\b\\//c"); var n6 = mdBuilder.GetOrAddDocumentName(@"a/"); var n7 = mdBuilder.GetOrAddDocumentName(@"/"); var n8 = mdBuilder.GetOrAddDocumentName(@"\\"); var n9 = mdBuilder.GetOrAddDocumentName("\ud800"); // unpaired surrogate var n10 = mdBuilder.GetOrAddDocumentName("\0"); var root = new MetadataRootBuilder(mdBuilder); var rootBuilder = new BlobBuilder(); root.Serialize(rootBuilder, 0, 0); var mdImage = rootBuilder.ToImmutableArray(); using (var provider = MetadataReaderProvider.FromMetadataImage(mdImage)) { var mdReader = provider.GetMetadataReader(); Assert.Equal("", mdReader.GetString(MetadataTokens.DocumentNameBlobHandle(MetadataTokens.GetHeapOffset(n1)))); Assert.Equal("/a/b/c", mdReader.GetString(MetadataTokens.DocumentNameBlobHandle(MetadataTokens.GetHeapOffset(n2)))); Assert.Equal(@"\a\b\cc", mdReader.GetString(MetadataTokens.DocumentNameBlobHandle(MetadataTokens.GetHeapOffset(n3)))); Assert.Equal(@"/a/b\c", mdReader.GetString(MetadataTokens.DocumentNameBlobHandle(MetadataTokens.GetHeapOffset(n4)))); Assert.Equal(@"/\a/\b\\//c", mdReader.GetString(MetadataTokens.DocumentNameBlobHandle(MetadataTokens.GetHeapOffset(n5)))); Assert.Equal(@"a/", mdReader.GetString(MetadataTokens.DocumentNameBlobHandle(MetadataTokens.GetHeapOffset(n6)))); Assert.Equal(@"/", mdReader.GetString(MetadataTokens.DocumentNameBlobHandle(MetadataTokens.GetHeapOffset(n7)))); Assert.Equal(@"\\", mdReader.GetString(MetadataTokens.DocumentNameBlobHandle(MetadataTokens.GetHeapOffset(n8)))); Assert.Equal("\uFFFd\uFFFd", mdReader.GetString(MetadataTokens.DocumentNameBlobHandle(MetadataTokens.GetHeapOffset(n9)))); Assert.Equal("\0", mdReader.GetString(MetadataTokens.DocumentNameBlobHandle(MetadataTokens.GetHeapOffset(n10)))); } }
public void GetMetadataReader_FromMetadataImage() { TestGetMetadataReader(MetadataReaderProvider.FromMetadataImage(BuildMetadataImage().ToImmutableArray())); }
private static MetadataReader GetMetadataReaderFromProvider() => MetadataReaderProvider.FromMetadataImage(PortablePdbs.DocumentsPdb.ToImmutableArray()).GetMetadataReader();