Browse Source

Fix assertions on AssemblyList.Sort and AssemblyList.Unload. Fix hang on LoadDependencies.Execute.

pull/2301/head
Siegfried Pammer 4 years ago
parent
commit
fff2d0a787
  1. 8
      ILSpy/AssemblyList.cs
  2. 7
      ILSpy/TreeNodes/AssemblyTreeNode.cs

8
ILSpy/AssemblyList.cs

@ -329,7 +329,7 @@ namespace ICSharpCode.ILSpy
return null; return null;
var newAsm = new LoadedAssembly(this, target.FileName, pdbFileName: target.PdbFileName); var newAsm = new LoadedAssembly(this, target.FileName, pdbFileName: target.PdbFileName);
newAsm.IsAutoLoaded = target.IsAutoLoaded; newAsm.IsAutoLoaded = target.IsAutoLoaded;
lock (assemblies) lock (lockObj)
{ {
this.assemblies.Remove(target); this.assemblies.Remove(target);
this.assemblies.Insert(index, newAsm); this.assemblies.Insert(index, newAsm);
@ -340,7 +340,7 @@ namespace ICSharpCode.ILSpy
public void Unload(LoadedAssembly assembly) public void Unload(LoadedAssembly assembly)
{ {
App.Current.Dispatcher.VerifyAccess(); App.Current.Dispatcher.VerifyAccess();
lock (assemblies) lock (lockObj)
{ {
assemblies.Remove(assembly); assemblies.Remove(assembly);
byFilename.Remove(assembly.FileName); byFilename.Remove(assembly.FileName);
@ -350,7 +350,7 @@ namespace ICSharpCode.ILSpy
static bool gcRequested; static bool gcRequested;
void RequestGC() static void RequestGC()
{ {
if (gcRequested) if (gcRequested)
return; return;
@ -370,7 +370,7 @@ namespace ICSharpCode.ILSpy
public void Sort(int index, int count, IComparer<LoadedAssembly> comparer) public void Sort(int index, int count, IComparer<LoadedAssembly> comparer)
{ {
App.Current.Dispatcher.VerifyAccess(); App.Current.Dispatcher.VerifyAccess();
lock (assemblies) lock (lockObj)
{ {
List<LoadedAssembly> list = new List<LoadedAssembly>(assemblies); List<LoadedAssembly> list = new List<LoadedAssembly>(assemblies);
list.Sort(index, Math.Min(count, list.Count - index), comparer); list.Sort(index, Math.Min(count, list.Count - index), comparer);

7
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -20,6 +20,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Documents; using System.Windows.Documents;
@ -460,10 +461,11 @@ namespace ICSharpCode.ILSpy.TreeNodes
return true; return true;
} }
public void Execute(TextViewContext context) public async void Execute(TextViewContext context)
{ {
if (context.SelectedTreeNodes == null) if (context.SelectedTreeNodes == null)
return; return;
var tasks = new List<Task>();
foreach (var node in context.SelectedTreeNodes) foreach (var node in context.SelectedTreeNodes)
{ {
var la = ((AssemblyTreeNode)node).LoadedAssembly; var la = ((AssemblyTreeNode)node).LoadedAssembly;
@ -474,10 +476,11 @@ namespace ICSharpCode.ILSpy.TreeNodes
var metadata = module.Metadata; var metadata = module.Metadata;
foreach (var assyRef in metadata.AssemblyReferences) foreach (var assyRef in metadata.AssemblyReferences)
{ {
resolver.Resolve(new AssemblyReference(module, assyRef)); tasks.Add(resolver.ResolveAsync(new AssemblyReference(module, assyRef)));
} }
} }
} }
await Task.WhenAll(tasks);
MainWindow.Instance.RefreshDecompiledView(); MainWindow.Instance.RefreshDecompiledView();
} }
} }

Loading…
Cancel
Save