Browse Source

Fix race condition in NavigateOnLaunch():

commandLineLoadedAssemblies is only usable from the main thread; so pass this list into NavigateOnLaunch()/FindEntityInRelevantAssemblies() via parameter.
pull/1556/head
Daniel Grunwald 6 years ago
parent
commit
962a0365a2
  1. 2
      ILSpy/LoadedAssembly.cs
  2. 15
      ILSpy/MainWindow.xaml.cs

2
ILSpy/LoadedAssembly.cs

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
@ -41,6 +42,7 @@ namespace ICSharpCode.ILSpy @@ -41,6 +42,7 @@ namespace ICSharpCode.ILSpy
/// <summary>
/// Represents an assembly loaded into ILSpy.
/// </summary>
[DebuggerDisplay("LoadedAssembly({shortName})")]
public sealed class LoadedAssembly
{
internal static readonly ConditionalWeakTable<PEFile, LoadedAssembly> loadedAssemblies = new ConditionalWeakTable<PEFile, LoadedAssembly>();

15
ILSpy/MainWindow.xaml.cs

@ -284,23 +284,24 @@ namespace ICSharpCode.ILSpy @@ -284,23 +284,24 @@ namespace ICSharpCode.ILSpy
LoadAssemblies(nugetPackagesToLoad, commandLineLoadedAssemblies, focusNode: false);
nugetPackagesToLoad.Clear();
}
NavigateOnLaunch(args.NavigateTo, sessionSettings.ActiveTreeViewPath, spySettings);
var relevantAssemblies = commandLineLoadedAssemblies.ToList();
commandLineLoadedAssemblies.Clear(); // clear references once we don't need them anymore
NavigateOnLaunch(args.NavigateTo, sessionSettings.ActiveTreeViewPath, spySettings, relevantAssemblies);
if (args.Search != null)
{
SearchPane.Instance.SearchTerm = args.Search;
SearchPane.Instance.Show();
}
commandLineLoadedAssemblies.Clear(); // clear references once we don't need them anymore
}
async void NavigateOnLaunch(string navigateTo, string[] activeTreeViewPath, ILSpySettings spySettings)
async void NavigateOnLaunch(string navigateTo, string[] activeTreeViewPath, ILSpySettings spySettings, List<LoadedAssembly> relevantAssemblies)
{
var initialSelection = treeView.SelectedItem;
if (navigateTo != null) {
bool found = false;
if (navigateTo.StartsWith("N:", StringComparison.Ordinal)) {
string namespaceName = navigateTo.Substring(2);
foreach (LoadedAssembly asm in commandLineLoadedAssemblies) {
foreach (LoadedAssembly asm in relevantAssemblies) {
AssemblyTreeNode asmNode = assemblyListTreeNode.FindAssemblyNode(asm);
if (asmNode != null) {
// FindNamespaceNode() blocks the UI if the assembly is not yet loaded,
@ -317,7 +318,7 @@ namespace ICSharpCode.ILSpy @@ -317,7 +318,7 @@ namespace ICSharpCode.ILSpy
}
}
} else {
IEntity mr = await Task.Run(() => FindEntityInCommandLineLoadedAssemblies(navigateTo));
IEntity mr = await Task.Run(() => FindEntityInRelevantAssemblies(navigateTo, relevantAssemblies));
if (mr != null && mr.ParentModule.PEFile != null) {
found = true;
if (treeView.SelectedItem == initialSelection) {
@ -362,7 +363,7 @@ namespace ICSharpCode.ILSpy @@ -362,7 +363,7 @@ namespace ICSharpCode.ILSpy
}
}
private IEntity FindEntityInCommandLineLoadedAssemblies(string navigateTo)
private IEntity FindEntityInRelevantAssemblies(string navigateTo, IEnumerable<LoadedAssembly> relevantAssemblies)
{
ITypeReference typeRef = null;
IMemberReference memberRef = null;
@ -372,7 +373,7 @@ namespace ICSharpCode.ILSpy @@ -372,7 +373,7 @@ namespace ICSharpCode.ILSpy
memberRef = IdStringProvider.ParseMemberIdString(navigateTo);
typeRef = memberRef.DeclaringTypeReference;
}
foreach (LoadedAssembly asm in commandLineLoadedAssemblies) {
foreach (LoadedAssembly asm in relevantAssemblies.ToList()) {
var module = asm.GetPEFileOrNull();
if (CanResolveTypeInPEFile(module, typeRef, out var typeHandle)) {
ICompilation compilation = typeHandle.Kind == HandleKind.ExportedType

Loading…
Cancel
Save