@ -22,6 +22,7 @@ using System.IO;
using System.Reflection.Metadata ;
using System.Reflection.Metadata ;
using System.Reflection.PortableExecutable ;
using System.Reflection.PortableExecutable ;
using System.Runtime.CompilerServices ;
using System.Runtime.CompilerServices ;
using System.Runtime.InteropServices ;
using System.Threading ;
using System.Threading ;
using System.Threading.Tasks ;
using System.Threading.Tasks ;
using ICSharpCode.Decompiler ;
using ICSharpCode.Decompiler ;
@ -174,12 +175,12 @@ namespace ICSharpCode.ILSpy
return module ;
return module ;
}
}
private void LoadSymbols ( PEFile module )
void LoadSymbols ( PEFile module )
{
{
try {
try {
var reader = module . Reader ;
var reader = module . Reader ;
// try to open portable pdb file/embedded pdb info:
// try to open portable pdb file/embedded pdb info:
if ( reader . TryOpenAssociated PortablePdb ( fileName , OpenStream , out var provider , out var pdbFileName ) ) {
if ( TryOpenPortablePdb ( module , out var provider , out var pdbFileName ) ) {
debugInfoProvider = new PortableDebugInfoProvider ( pdbFileName , provider ) ;
debugInfoProvider = new PortableDebugInfoProvider ( pdbFileName , provider ) ;
} else {
} else {
// search for pdb in same directory as dll
// search for pdb in same directory as dll
@ -192,20 +193,50 @@ namespace ICSharpCode.ILSpy
// TODO: use symbol cache, get symbols from microsoft
// TODO: use symbol cache, get symbols from microsoft
}
}
} catch ( BadImageFormatException ) {
} catch ( Exception ex ) when ( ex is BadImageFormatException | | ex is COM Exception ) {
// Ignore PDB load errors
// Ignore PDB load errors
}
}
}
Stream OpenStream ( string fileName )
const string LegacyPDBPrefix = "Microsoft C/C++ MSF 7.00" ;
{
byte [ ] buffer = new byte [ LegacyPDBPrefix . Length ] ;
if ( ! File . Exists ( fileName ) )
return null ;
bool TryOpenPortablePdb ( PEFile module , out MetadataReaderProvider provider , out string pdbFileName )
var memory = new MemoryStream ( ) ;
{
using ( var stream = File . OpenRead ( fileName ) )
provider = null ;
stream . CopyTo ( memory ) ;
pdbFileName = null ;
memory . Position = 0 ;
var reader = module . Reader ;
return memory ;
foreach ( var entry in reader . ReadDebugDirectory ( ) ) {
if ( entry . IsPortableCodeView ) {
return reader . TryOpenAssociatedPortablePdb ( fileName , OpenStream , out provider , out pdbFileName ) ;
}
if ( entry . Type = = DebugDirectoryEntryType . CodeView ) {
string pdbDirectory = Path . GetDirectoryName ( fileName ) ;
pdbFileName = Path . Combine ( pdbDirectory , Path . GetFileNameWithoutExtension ( fileName ) + ".pdb" ) ;
if ( File . Exists ( pdbFileName ) ) {
Stream stream = OpenStream ( pdbFileName ) ;
if ( stream . Read ( buffer , 0 , buffer . Length ) = = LegacyPDBPrefix . Length
& & System . Text . Encoding . ASCII . GetString ( buffer ) = = LegacyPDBPrefix ) {
return false ;
}
stream . Position = 0 ;
provider = MetadataReaderProvider . FromPortablePdbStream ( stream ) ;
return true ;
}
}
}
}
return false ;
}
Stream OpenStream ( string fileName )
{
if ( ! File . Exists ( fileName ) )
return null ;
var memory = new MemoryStream ( ) ;
using ( var stream = File . OpenRead ( fileName ) )
stream . CopyTo ( memory ) ;
memory . Position = 0 ;
return memory ;
}
}
[ThreadStatic]
[ThreadStatic]