diff --git a/ILSpy/App.xaml.cs b/ILSpy/App.xaml.cs index 7b6070884..5b9859ffb 100644 --- a/ILSpy/App.xaml.cs +++ b/ILSpy/App.xaml.cs @@ -191,7 +191,7 @@ namespace ICSharpCode.ILSpy [ThreadStatic] static bool showingError; - static void UnhandledException(Exception exception) + internal static void UnhandledException(Exception exception) { Debug.WriteLine(exception.ToString()); for (Exception ex = exception; ex != null; ex = ex.InnerException) diff --git a/ILSpy/DebugInfo/PortableDebugInfoProvider.cs b/ILSpy/DebugInfo/PortableDebugInfoProvider.cs index e57e81eae..f4c04cd3b 100644 --- a/ILSpy/DebugInfo/PortableDebugInfoProvider.cs +++ b/ILSpy/DebugInfo/PortableDebugInfoProvider.cs @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Reflection.Metadata; using ICSharpCode.Decompiler.DebugInfo; @@ -28,8 +29,8 @@ namespace ICSharpCode.Decompiler.PdbProvider { string pdbFileName; string moduleFileName; - - internal MetadataReaderProvider Provider { get; } + readonly MetadataReaderProvider provider; + bool hasError; internal bool IsEmbedded => pdbFileName == null; @@ -38,20 +39,54 @@ namespace ICSharpCode.Decompiler.PdbProvider { this.pdbFileName = pdbFileName; this.moduleFileName = moduleFileName; - this.Provider = provider ?? throw new ArgumentNullException(nameof(provider)); + this.provider = provider ?? throw new ArgumentNullException(nameof(provider)); + } + + public string Description { + get { + if (pdbFileName == null) + { + if (hasError) + return "Error while loading the PDB stream embedded in this assembly"; + return "Embedded in this assembly"; + } + else + { + if (hasError) + return $"Error while loading portable PDB: {pdbFileName}"; + return $"Loaded from portable PDB: {pdbFileName}"; + } + } } - public string Description => pdbFileName == null - ? "Embedded in this assembly" - : $"Loaded from portable PDB: {pdbFileName}"; + internal MetadataReader GetMetadataReader() + { + try + { + hasError = false; + return provider.GetMetadataReader(); + } + catch (BadImageFormatException) + { + hasError = true; + return null; + } + catch (IOException) + { + hasError = true; + return null; + } + } public string SourceFileName => pdbFileName ?? moduleFileName; public IList GetSequencePoints(MethodDefinitionHandle method) { - var metadata = Provider.GetMetadataReader(); + var metadata = GetMetadataReader(); var debugInfo = metadata.GetMethodDebugInformation(method); - var sequencePoints = new List(); + var sequencePoints = new List(); + if (metadata == null) + return sequencePoints; foreach (var point in debugInfo.GetSequencePoints()) { @@ -82,8 +117,10 @@ namespace ICSharpCode.Decompiler.PdbProvider public IList GetVariables(MethodDefinitionHandle method) { - var metadata = Provider.GetMetadataReader(); + var metadata = GetMetadataReader(); var variables = new List(); + if (metadata == null) + return variables; foreach (var h in metadata.GetLocalScopes(method)) { @@ -100,8 +137,10 @@ namespace ICSharpCode.Decompiler.PdbProvider public bool TryGetName(MethodDefinitionHandle method, int index, out string name) { - var metadata = Provider.GetMetadataReader(); + var metadata = GetMetadataReader(); name = null; + if (metadata == null) + return false; foreach (var h in metadata.GetLocalScopes(method)) { diff --git a/ILSpy/TreeNodes/AssemblyTreeNode.cs b/ILSpy/TreeNodes/AssemblyTreeNode.cs index 54881e074..d2dfe9bf4 100644 --- a/ILSpy/TreeNodes/AssemblyTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyTreeNode.cs @@ -181,14 +181,21 @@ namespace ICSharpCode.ILSpy.TreeNodes // if we crashed on loading, then we don't have any children return; } - if (loadResult.PEFile != null) + try { - LoadChildrenForPEFile(loadResult.PEFile); + if (loadResult.PEFile != null) + { + LoadChildrenForPEFile(loadResult.PEFile); + } + else if (loadResult.Package != null) + { + var package = loadResult.Package; + this.Children.AddRange(PackageFolderTreeNode.LoadChildrenForFolder(package.RootFolder)); + } } - else if (loadResult.Package != null) + catch (Exception ex) { - var package = loadResult.Package; - this.Children.AddRange(PackageFolderTreeNode.LoadChildrenForFolder(package.RootFolder)); + App.UnhandledException(ex); } } @@ -198,9 +205,10 @@ namespace ICSharpCode.ILSpy.TreeNodes var assembly = (MetadataModule)typeSystem.MainModule; this.Children.Add(new Metadata.MetadataTreeNode(module, this)); Decompiler.DebugInfo.IDebugInfoProvider debugInfo = LoadedAssembly.GetDebugInfoOrNull(); - if (debugInfo is Decompiler.PdbProvider.PortableDebugInfoProvider ppdb) + if (debugInfo is Decompiler.PdbProvider.PortableDebugInfoProvider ppdb + && ppdb.GetMetadataReader() is System.Reflection.Metadata.MetadataReader reader) { - this.Children.Add(new Metadata.DebugMetadataTreeNode(module, ppdb.IsEmbedded, ppdb.Provider.GetMetadataReader(), this)); + this.Children.Add(new Metadata.DebugMetadataTreeNode(module, ppdb.IsEmbedded, reader, this)); } this.Children.Add(new ReferenceFolderTreeNode(module, this)); if (module.Resources.Any())