Browse Source

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)

pull/1143/head
Siegfried Pammer 8 years ago
parent
commit
6a1e865fba
  1. 33
      ILSpy/TreeNodes/Analyzer/ScopedWhereUsedAnalyzer.cs

33
ILSpy/TreeNodes/Analyzer/ScopedWhereUsedAnalyzer.cs

@ -250,26 +250,27 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer @@ -250,26 +250,27 @@ namespace ICSharpCode.ILSpy.TreeNodes.Analyzer
private IEnumerable<AssemblyDefinition> GetReferencingAssemblies(AssemblyDefinition asm, CancellationToken ct)
{
yield return asm;
string requiredAssemblyFullName = asm.FullName;
using (LoadedAssembly.DisableAssemblyLoad()) {
yield return asm;
IEnumerable<LoadedAssembly> assemblies = MainWindow.Instance.CurrentAssemblyList.GetAssemblies().Where(assy => assy.GetAssemblyDefinitionOrNull() != null);
IEnumerable<LoadedAssembly> 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;
}
}

Loading…
Cancel
Save