From 6a1e865fbacc2382e3206efb1aa4811b91461cad Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 10 May 2018 12:22:00 +0200 Subject: [PATCH] Fix ScopedWhereUsedAnalyzer.GetReferencingAssemblies: When looking for referenced assemblies use built-in assembly resolver. This makes the analyzer use the same assembly references as the decompiler, which leads to better analysis results, or even any results when dealing with an assembly for which the framework is not installed. (Might be related to #1070 as well) --- .../Analyzer/ScopedWhereUsedAnalyzer.cs | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/ILSpy/TreeNodes/Analyzer/ScopedWhereUsedAnalyzer.cs b/ILSpy/TreeNodes/Analyzer/ScopedWhereUsedAnalyzer.cs index ad7112334..9aea11c87 100644 --- a/ILSpy/TreeNodes/Analyzer/ScopedWhereUsedAnalyzer.cs +++ b/ILSpy/TreeNodes/Analyzer/ScopedWhereUsedAnalyzer.cs @@ -250,26 +250,27 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer private IEnumerable GetReferencingAssemblies(AssemblyDefinition asm, CancellationToken ct) { - yield return asm; - - string requiredAssemblyFullName = asm.FullName; + using (LoadedAssembly.DisableAssemblyLoad()) { + yield return asm; - IEnumerable assemblies = MainWindow.Instance.CurrentAssemblyList.GetAssemblies().Where(assy => assy.GetAssemblyDefinitionOrNull() != null); + IEnumerable assemblies = MainWindow.Instance.CurrentAssemblyList.GetAssemblies().Where(assy => assy.GetAssemblyDefinitionOrNull() != null); - foreach (var assembly in assemblies) { - ct.ThrowIfCancellationRequested(); - bool found = false; - var module = assembly.GetModuleDefinitionOrNull(); - if (module == null) - continue; - foreach (var reference in module.AssemblyReferences) { - if (requiredAssemblyFullName == reference.FullName) { - found = true; - break; + foreach (var assembly in assemblies) { + ct.ThrowIfCancellationRequested(); + bool found = false; + var module = assembly.GetModuleDefinitionOrNull(); + if (module == null) + continue; + var resolver = assembly.GetAssemblyResolver(); + foreach (var reference in module.AssemblyReferences) { + if (resolver.Resolve(reference) == asm) { + found = true; + break; + } } + if (found && AssemblyReferencesScopeType(module.Assembly)) + yield return module.Assembly; } - if (found && AssemblyReferencesScopeType(module.Assembly)) - yield return module.Assembly; } }