System.Diagnostics.StackTraceSymbols.TryGetReader C# (CSharp) Method

TryGetReader() private method

Returns the portable PDB reader for the assembly path
Assumes that neither PE image nor PDB loaded into memory can be unloaded or moved around.
private TryGetReader ( string assemblyPath, IntPtr loadedPeAddress, int loadedPeSize, IntPtr inMemoryPdbAddress, int inMemoryPdbSize ) : System.Reflection.Metadata.MetadataReader
assemblyPath string /// File path of the assembly or null if the module is dynamic (generated by Reflection.Emit). ///
loadedPeAddress IntPtr /// Loaded PE image address or zero if the module is dynamic (generated by Reflection.Emit). /// Dynamic modules have their PDBs (if any) generated to an in-memory stream /// (pointed to by and ). ///
loadedPeSize int loaded PE image size
inMemoryPdbAddress IntPtr in memory PDB address or zero
inMemoryPdbSize int in memory PDB size
return System.Reflection.Metadata.MetadataReader
        private unsafe MetadataReader TryGetReader(string assemblyPath, IntPtr loadedPeAddress, int loadedPeSize, IntPtr inMemoryPdbAddress, int inMemoryPdbSize)
        {
            if ((loadedPeAddress == IntPtr.Zero || assemblyPath == null) && inMemoryPdbAddress == IntPtr.Zero)
            {
                // Dynamic or in-memory module without symbols (they would be in-memory if they were available).
                return null;
            }

            IntPtr cacheKey = (inMemoryPdbAddress != IntPtr.Zero) ? inMemoryPdbAddress : loadedPeAddress;

            MetadataReaderProvider provider;
            if (_metadataCache.TryGetValue(cacheKey, out provider))
            {
                return provider.GetMetadataReader();
            }

            provider = (inMemoryPdbAddress != IntPtr.Zero) ?
                TryOpenReaderForInMemoryPdb(inMemoryPdbAddress, inMemoryPdbSize) :
                TryOpenReaderFromAssemblyFile(assemblyPath, loadedPeAddress, loadedPeSize);

            if (provider == null)
            {
                return null;
            }

            _metadataCache.Add(cacheKey, provider);

            // The reader has already been open, so this doesn't throw:
            return provider.GetMetadataReader();
        }