diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index 37e7cf80b..9b0379b36 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -288,7 +288,7 @@ namespace ICSharpCode.ILSpy void AddReferenceWarningMessage(AssemblyDefinition assembly, ITextOutput output) { - var loadedAssembly = MainWindow.Instance.CurrentAssemblyList.GetAssemblies().FirstOrDefault(la => la.GetAssemblyDefinitionAsync().Result == assembly); + var loadedAssembly = MainWindow.Instance.CurrentAssemblyList.GetAssemblies().FirstOrDefault(la => la.GetAssemblyDefinitionOrNull() == assembly); if (loadedAssembly == null || !loadedAssembly.LoadedAssemblyReferencesInfo.HasErrors) return; const string line1 = "Warning: Some assembly references could not be loaded. This might lead to incorrect decompilation of some parts,"; diff --git a/ILSpy/Languages/Language.cs b/ILSpy/Languages/Language.cs index 3741be548..7440f84b8 100644 --- a/ILSpy/Languages/Language.cs +++ b/ILSpy/Languages/Language.cs @@ -87,8 +87,9 @@ namespace ICSharpCode.ILSpy public virtual void DecompileAssembly(LoadedAssembly assembly, ITextOutput output, DecompilationOptions options) { WriteCommentLine(output, assembly.FileName); - if (assembly.GetAssemblyDefinitionAsync().Result != null) { - var name = assembly.GetAssemblyDefinitionAsync().Result.Name; + var asm = assembly.GetAssemblyDefinitionOrNull(); + if (asm != null) { + var name = asm.Name; if (name.IsWindowsRuntime) { WriteCommentLine(output, name.Name + " [WinRT]"); } else { diff --git a/ILSpy/LoadedAssembly.cs b/ILSpy/LoadedAssembly.cs index f3a932d04..c51ff4ed5 100644 --- a/ILSpy/LoadedAssembly.cs +++ b/ILSpy/LoadedAssembly.cs @@ -58,7 +58,7 @@ namespace ICSharpCode.ILSpy /// public async Task GetTargetFrameworkIdAsync() { - var assembly = await GetAssemblyDefinitionAsync(); + var assembly = await GetAssemblyDefinitionAsync().ConfigureAwait(false); return assembly?.DetectTargetFrameworkId() ?? string.Empty; } @@ -66,22 +66,43 @@ namespace ICSharpCode.ILSpy /// /// Gets the Cecil ModuleDefinition. - /// Can return null when there was a load error. /// public Task GetModuleDefinitionAsync() { return assemblyTask; } - + + /// + /// Gets the Cecil ModuleDefinition. + /// Returns null in case of load errors. + /// + public ModuleDefinition GetModuleDefinitionOrNull() + { + try { + return GetModuleDefinitionAsync().Result; + } catch (Exception ex) { + System.Diagnostics.Trace.TraceError(ex.ToString()); + return null; + } + } + /// /// Gets the Cecil AssemblyDefinition. - /// Returns null when there was a load error; or when opening a netmodule. /// public async Task GetAssemblyDefinitionAsync() + { + var module = await assemblyTask.ConfigureAwait(false); + return module != null ? module.Assembly : null; + } + + /// + /// Gets the Cecil AssemblyDefinition. + /// Returns null when there was a load error; or when opening a netmodule. + /// + public AssemblyDefinition GetAssemblyDefinitionOrNull() { try { - var module = await assemblyTask; - return module != null ? module.Assembly : null; + return GetAssemblyDefinitionAsync().Result; } catch (Exception ex) { System.Diagnostics.Trace.TraceError(ex.ToString()); return null; @@ -97,7 +118,7 @@ namespace ICSharpCode.ILSpy public string Text { get { if (IsLoaded && !HasLoadError) { - return String.Format("{0} ({1})", ShortName, GetAssemblyDefinitionAsync().Result.Name.Version); + return String.Format("{0} ({1})", ShortName, GetAssemblyDefinitionOrNull().Name.Version); } else { return ShortName; } @@ -196,14 +217,12 @@ namespace ICSharpCode.ILSpy public AssemblyDefinition Resolve(AssemblyNameReference name) { - var node = parent.LookupReferencedAssembly(name); - return node != null ? node.GetAssemblyDefinitionAsync().Result : null; + return parent.LookupReferencedAssembly(name)?.GetAssemblyDefinitionOrNull(); } public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) { - var node = parent.LookupReferencedAssembly(name); - return node != null ? node.GetAssemblyDefinitionAsync().Result : null; + return parent.LookupReferencedAssembly(name)?.GetAssemblyDefinitionOrNull(); } public void Dispose() @@ -243,7 +262,7 @@ namespace ICSharpCode.ILSpy LoadedAssembly asm; lock (loadingAssemblies) { foreach (LoadedAssembly loaded in assemblyList.GetAssemblies()) { - var asmDef = loaded.GetAssemblyDefinitionAsync().Result; + var asmDef = loaded.GetAssemblyDefinitionOrNull(); if (asmDef != null && data.fullName.Equals(data.isWinRT ? asmDef.Name.Name : asmDef.FullName, StringComparison.OrdinalIgnoreCase)) { return loaded; } diff --git a/ILSpy/TreeNodes/Analyzer/AnalyzedAttributeAppliedToTreeNode.cs b/ILSpy/TreeNodes/Analyzer/AnalyzedAttributeAppliedToTreeNode.cs index 1be5999c7..a5211f757 100644 --- a/ILSpy/TreeNodes/Analyzer/AnalyzedAttributeAppliedToTreeNode.cs +++ b/ILSpy/TreeNodes/Analyzer/AnalyzedAttributeAppliedToTreeNode.cs @@ -295,21 +295,24 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer string requiredAssemblyFullName = asm.FullName; - IEnumerable assemblies = MainWindow.Instance.CurrentAssemblyList.GetAssemblies().Where(assy => assy.GetAssemblyDefinitionAsync().Result != null); + IEnumerable assemblies = MainWindow.Instance.CurrentAssemblyList.GetAssemblies().Where(assy => assy.GetAssemblyDefinitionOrNull() != null); foreach (var assembly in assemblies) { ct.ThrowIfCancellationRequested(); bool found = false; - foreach (var reference in assembly.GetAssemblyDefinitionAsync().Result.MainModule.AssemblyReferences) { + var module = assembly.GetModuleDefinitionOrNull(); + if (module == null) + continue; + foreach (var reference in module.AssemblyReferences) { if (requiredAssemblyFullName == reference.FullName) { found = true; break; } } if (found) { - var typeref = GetScopeTypeReferenceInAssembly(assembly.GetAssemblyDefinitionAsync().Result); + var typeref = GetScopeTypeReferenceInAssembly(module.Assembly); if (typeref != null) - yield return new Tuple(assembly.GetAssemblyDefinitionAsync().Result, typeref); + yield return new Tuple(module.Assembly, typeref); } } } @@ -333,10 +336,13 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer foreach (var assembly in assemblies) { ct.ThrowIfCancellationRequested(); + var module = assembly.GetModuleDefinitionOrNull(); + if (module == null) + continue; if (friendAssemblies.Contains(assembly.ShortName)) { - var typeref = GetScopeTypeReferenceInAssembly(assembly.GetAssemblyDefinitionAsync().Result); + var typeref = GetScopeTypeReferenceInAssembly(module.Assembly); if (typeref != null) { - yield return new Tuple(assembly.GetAssemblyDefinitionAsync().Result, typeref); + yield return new Tuple(module.Assembly, typeref); } } } diff --git a/ILSpy/TreeNodes/Analyzer/ScopedWhereUsedAnalyzer.cs b/ILSpy/TreeNodes/Analyzer/ScopedWhereUsedAnalyzer.cs index ecce52a7e..ad7112334 100644 --- a/ILSpy/TreeNodes/Analyzer/ScopedWhereUsedAnalyzer.cs +++ b/ILSpy/TreeNodes/Analyzer/ScopedWhereUsedAnalyzer.cs @@ -254,19 +254,22 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer string requiredAssemblyFullName = asm.FullName; - IEnumerable assemblies = MainWindow.Instance.CurrentAssemblyList.GetAssemblies().Where(assy => assy.GetAssemblyDefinitionAsync().Result != null); + IEnumerable assemblies = MainWindow.Instance.CurrentAssemblyList.GetAssemblies().Where(assy => assy.GetAssemblyDefinitionOrNull() != null); foreach (var assembly in assemblies) { ct.ThrowIfCancellationRequested(); bool found = false; - foreach (var reference in assembly.GetAssemblyDefinitionAsync().Result.MainModule.AssemblyReferences) { + var module = assembly.GetModuleDefinitionOrNull(); + if (module == null) + continue; + foreach (var reference in module.AssemblyReferences) { if (requiredAssemblyFullName == reference.FullName) { found = true; break; } } - if (found && AssemblyReferencesScopeType(assembly.GetAssemblyDefinitionAsync().Result)) - yield return assembly.GetAssemblyDefinitionAsync().Result; + if (found && AssemblyReferencesScopeType(module.Assembly)) + yield return module.Assembly; } } @@ -289,8 +292,12 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer foreach (var assembly in assemblies) { ct.ThrowIfCancellationRequested(); - if (friendAssemblies.Contains(assembly.ShortName) && AssemblyReferencesScopeType(assembly.GetAssemblyDefinitionAsync().Result)) { - yield return assembly.GetAssemblyDefinitionAsync().Result; + if (friendAssemblies.Contains(assembly.ShortName)) { + var module = assembly.GetModuleDefinitionOrNull(); + if (module == null) + continue; + if (AssemblyReferencesScopeType(module.Assembly)) + yield return module.Assembly; } } } diff --git a/ILSpy/TreeNodes/AssemblyListTreeNode.cs b/ILSpy/TreeNodes/AssemblyListTreeNode.cs index 08937fead..428967a7b 100644 --- a/ILSpy/TreeNodes/AssemblyListTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyListTreeNode.cs @@ -197,7 +197,7 @@ namespace ICSharpCode.ILSpy.TreeNodes return null; App.Current.Dispatcher.VerifyAccess(); foreach (AssemblyTreeNode node in this.Children) { - if (node.LoadedAssembly.IsLoaded && node.LoadedAssembly.GetAssemblyDefinitionAsync().Result == asm) + if (node.LoadedAssembly.IsLoaded && node.LoadedAssembly.GetAssemblyDefinitionOrNull() == asm) return node; } return null; diff --git a/ILSpy/TreeNodes/AssemblyTreeNode.cs b/ILSpy/TreeNodes/AssemblyTreeNode.cs index ac6ae77ab..57631af2a 100644 --- a/ILSpy/TreeNodes/AssemblyTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyTreeNode.cs @@ -97,8 +97,8 @@ namespace ICSharpCode.ILSpy.TreeNodes if (tooltip == null && assembly.IsLoaded) { tooltip = new TextBlock(); - var module = assembly.GetModuleDefinitionAsync().Result; - if (assembly.GetAssemblyDefinitionAsync().Result != null) { + var module = assembly.GetModuleDefinitionOrNull(); + if (module.Assembly != null) { tooltip.Inlines.Add(new Bold(new Run("Name: "))); tooltip.Inlines.Add(new Run(module.Assembly.FullName)); tooltip.Inlines.Add(new LineBreak());