Browse Source

Fix #1014: fix assembly load errors causing ILSpy to crash

pull/1039/head
Daniel Grunwald 8 years ago
parent
commit
d18b4c2a1f
  1. 4
      ILSpy/MainWindow.xaml.cs
  2. 2
      ILSpy/SearchPane.cs
  3. 2
      ILSpy/TreeNodes/Analyzer/AnalyzerEntityTreeNode.cs
  4. 2
      ILSpy/TreeNodes/AssemblyListTreeNode.cs
  5. 2
      ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs
  6. 7
      ILSpy/TreeNodes/AssemblyTreeNode.cs
  7. 2
      ILSpy/TreeNodes/DerivedTypesTreeNode.cs
  8. 2
      TestPlugin/ContextMenuCommand.cs

4
ILSpy/MainWindow.xaml.cs

@ -273,7 +273,7 @@ namespace ICSharpCode.ILSpy
} }
} else { } else {
foreach (LoadedAssembly asm in commandLineLoadedAssemblies) { foreach (LoadedAssembly asm in commandLineLoadedAssemblies) {
ModuleDefinition def = asm.GetModuleDefinitionAsync().Result; ModuleDefinition def = asm.GetModuleDefinitionOrNull();
if (def != null) { if (def != null) {
MemberReference mr = XmlDocKeyProvider.FindMemberByKey(def, args.NavigateTo); MemberReference mr = XmlDocKeyProvider.FindMemberByKey(def, args.NavigateTo);
if (mr != null) { if (mr != null) {
@ -292,7 +292,7 @@ namespace ICSharpCode.ILSpy
} else if (commandLineLoadedAssemblies.Count == 1) { } else if (commandLineLoadedAssemblies.Count == 1) {
// NavigateTo == null and an assembly was given on the command-line: // NavigateTo == null and an assembly was given on the command-line:
// Select the newly loaded assembly // Select the newly loaded assembly
JumpToReference(commandLineLoadedAssemblies[0].GetModuleDefinitionAsync().Result); JumpToReference(commandLineLoadedAssemblies[0].GetModuleDefinitionOrNull());
} }
if (args.Search != null) if (args.Search != null)
{ {

2
ILSpy/SearchPane.cs

@ -216,7 +216,7 @@ namespace ICSharpCode.ILSpy
try { try {
var searcher = GetSearchStrategy(searchMode, searchTerm); var searcher = GetSearchStrategy(searchMode, searchTerm);
foreach (var loadedAssembly in assemblies) { foreach (var loadedAssembly in assemblies) {
ModuleDefinition module = loadedAssembly.GetModuleDefinitionAsync().Result; ModuleDefinition module = loadedAssembly.GetModuleDefinitionOrNull();
if (module == null) if (module == null)
continue; continue;
CancellationToken cancellationToken = cts.Token; CancellationToken cancellationToken = cts.Token;

2
ILSpy/TreeNodes/Analyzer/AnalyzerEntityTreeNode.cs

@ -38,7 +38,7 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer
public override bool HandleAssemblyListChanged(ICollection<LoadedAssembly> removedAssemblies, ICollection<LoadedAssembly> addedAssemblies) public override bool HandleAssemblyListChanged(ICollection<LoadedAssembly> removedAssemblies, ICollection<LoadedAssembly> addedAssemblies)
{ {
foreach (LoadedAssembly asm in removedAssemblies) { foreach (LoadedAssembly asm in removedAssemblies) {
if (this.Member.Module == asm.GetModuleDefinitionAsync().Result) if (this.Member.Module == asm.GetModuleDefinitionOrNull())
return false; // remove this node return false; // remove this node
} }
this.Children.RemoveAll( this.Children.RemoveAll(

2
ILSpy/TreeNodes/AssemblyListTreeNode.cs

@ -185,7 +185,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
return null; return null;
App.Current.Dispatcher.VerifyAccess(); App.Current.Dispatcher.VerifyAccess();
foreach (AssemblyTreeNode node in this.Children) { foreach (AssemblyTreeNode node in this.Children) {
if (node.LoadedAssembly.IsLoaded && node.LoadedAssembly.GetModuleDefinitionAsync().Result == module) if (node.LoadedAssembly.IsLoaded && node.LoadedAssembly.GetModuleDefinitionOrNull() == module)
return node; return node;
} }
return null; return null;

2
ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs

@ -77,7 +77,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
if (assemblyListNode != null) { if (assemblyListNode != null) {
var refNode = assemblyListNode.FindAssemblyNode(parentAssembly.LoadedAssembly.LookupReferencedAssembly(r)); var refNode = assemblyListNode.FindAssemblyNode(parentAssembly.LoadedAssembly.LookupReferencedAssembly(r));
if (refNode != null) { if (refNode != null) {
ModuleDefinition module = refNode.LoadedAssembly.GetModuleDefinitionAsync().Result; ModuleDefinition module = refNode.LoadedAssembly.GetModuleDefinitionOrNull();
if (module != null) { if (module != null) {
foreach (var childRef in module.AssemblyReferences) foreach (var childRef in module.AssemblyReferences)
this.Children.Add(new AssemblyReferenceTreeNode(childRef, refNode)); this.Children.Add(new AssemblyReferenceTreeNode(childRef, refNode));

7
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -145,7 +145,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
protected override void LoadChildren() protected override void LoadChildren()
{ {
ModuleDefinition moduleDefinition = assembly.GetModuleDefinitionAsync().Result; ModuleDefinition moduleDefinition = assembly.GetModuleDefinitionOrNull();
if (moduleDefinition == null) { if (moduleDefinition == null) {
// if we crashed on loading, then we don't have any children // if we crashed on loading, then we don't have any children
return; return;
@ -396,8 +396,9 @@ namespace ICSharpCode.ILSpy.TreeNodes
return; return;
foreach (var node in context.SelectedTreeNodes) { foreach (var node in context.SelectedTreeNodes) {
var la = ((AssemblyTreeNode)node).LoadedAssembly; var la = ((AssemblyTreeNode)node).LoadedAssembly;
if (!la.HasLoadError) { var module = la.GetModuleDefinitionOrNull();
foreach (var assyRef in la.GetModuleDefinitionAsync().Result.AssemblyReferences) { if (module != null) {
foreach (var assyRef in module.AssemblyReferences) {
la.LookupReferencedAssembly(assyRef); la.LookupReferencedAssembly(assyRef);
} }
} }

2
ILSpy/TreeNodes/DerivedTypesTreeNode.cs

@ -60,7 +60,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
IEnumerable<ILSpyTreeNode> FetchChildren(CancellationToken cancellationToken) IEnumerable<ILSpyTreeNode> FetchChildren(CancellationToken cancellationToken)
{ {
// FetchChildren() runs on the main thread; but the enumerator will be consumed on a background thread // FetchChildren() runs on the main thread; but the enumerator will be consumed on a background thread
var assemblies = list.GetAssemblies().Select(node => node.GetModuleDefinitionAsync().Result).Where(asm => asm != null).ToArray(); var assemblies = list.GetAssemblies().Select(node => node.GetModuleDefinitionOrNull()).Where(asm => asm != null).ToArray();
return FindDerivedTypes(type, assemblies, cancellationToken); return FindDerivedTypes(type, assemblies, cancellationToken);
} }

2
TestPlugin/ContextMenuCommand.cs

@ -27,7 +27,7 @@ namespace TestPlugin
if (context.SelectedTreeNodes == null) if (context.SelectedTreeNodes == null)
return; return;
AssemblyTreeNode node = (AssemblyTreeNode)context.SelectedTreeNodes[0]; AssemblyTreeNode node = (AssemblyTreeNode)context.SelectedTreeNodes[0];
AssemblyDefinition asm = node.LoadedAssembly.GetAssemblyDefinitionAsync().Result; AssemblyDefinition asm = node.LoadedAssembly.GetAssemblyDefinitionOrNull();
if (asm != null) { if (asm != null) {
SaveFileDialog dlg = new SaveFileDialog(); SaveFileDialog dlg = new SaveFileDialog();
dlg.FileName = node.LoadedAssembly.FileName; dlg.FileName = node.LoadedAssembly.FileName;

Loading…
Cancel
Save