From c729922961a915ae73ec807760c818b3791d8f08 Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sat, 28 Sep 2019 20:05:30 +0200 Subject: [PATCH] AddIn: Improve resolution of reference assemblies by removing code duplicates and using logic from ILSpy decompiler. --- ILSpy.AddIn/AssemblyFileFinder.cs | 34 +++++------------------- ILSpy.AddIn/Commands/OpenILSpyCommand.cs | 11 +++----- 2 files changed, 9 insertions(+), 36 deletions(-) diff --git a/ILSpy.AddIn/AssemblyFileFinder.cs b/ILSpy.AddIn/AssemblyFileFinder.cs index ee43801a6..089ef88cb 100644 --- a/ILSpy.AddIn/AssemblyFileFinder.cs +++ b/ILSpy.AddIn/AssemblyFileFinder.cs @@ -15,35 +15,13 @@ namespace ICSharpCode.ILSpy.AddIn { public static string FindAssemblyFile(AssemblyDefinition assemblyDefinition, string assemblyFile) { - var assemblyName = assemblyDefinition.Name; - - var detectedTargetFramework = DetectTargetFrameworkId(assemblyDefinition, assemblyFile); - if (string.IsNullOrEmpty(detectedTargetFramework)) { - // Without a target framework id it makes no sense to continue - return null; - } - - var targetFramework = detectedTargetFramework.Split(new[] { ",Version=v" }, StringSplitOptions.None); - string file = null; - switch (targetFramework[0]) { - case ".NETCoreApp": - case ".NETStandard": - if (targetFramework.Length != 2) - return FindAssemblyFromGAC(assemblyDefinition); - var version = targetFramework[1].Length == 3 ? new Version(targetFramework[1] + ".0") : new Version(targetFramework[1]); - var dotNetCorePathFinder = new DotNetCorePathFinder(assemblyFile, detectedTargetFramework, version); - file = dotNetCorePathFinder.TryResolveDotNetCore(Decompiler.Metadata.AssemblyNameReference.Parse(assemblyName.FullName)); - if (file != null) - return file; - return FindAssemblyFromGAC(assemblyDefinition); - default: - return FindAssemblyFromGAC(assemblyDefinition); + var assemblyResolver = new UniversalAssemblyResolver(assemblyFile, false, + DetectTargetFrameworkId(assemblyDefinition, assemblyFile)); + if (IsReferenceAssembly(assemblyDefinition, assemblyFile)) { + assemblyResolver.RemoveSearchDirectory(Path.GetDirectoryName(assemblyFile)); } - } - - static string FindAssemblyFromGAC(AssemblyDefinition assemblyDefinition) - { - return GacInterop.FindAssemblyInNetGac(Decompiler.Metadata.AssemblyNameReference.Parse(assemblyDefinition.Name.FullName)); + return assemblyResolver.FindAssemblyFile( + ICSharpCode.Decompiler.Metadata.AssemblyNameReference.Parse(assemblyDefinition.Name.FullName)); } static readonly string RefPathPattern = @"NuGetFallbackFolder[/\\][^/\\]+[/\\][^/\\]+[/\\]ref[/\\]"; diff --git a/ILSpy.AddIn/Commands/OpenILSpyCommand.cs b/ILSpy.AddIn/Commands/OpenILSpyCommand.cs index acb7b12b9..1d569193a 100644 --- a/ILSpy.AddIn/Commands/OpenILSpyCommand.cs +++ b/ILSpy.AddIn/Commands/OpenILSpyCommand.cs @@ -79,14 +79,9 @@ namespace ICSharpCode.ILSpy.AddIn.Commands foreach (var reference in parentProject.MetadataReferences) { using (var assemblyDef = AssemblyDefinition.ReadAssembly(reference.Display)) { string assemblyName = assemblyDef.Name.Name; - if (AssemblyFileFinder.IsReferenceAssembly(assemblyDef, reference.Display)) { - string resolvedAssemblyFile = AssemblyFileFinder.FindAssemblyFile(assemblyDef, reference.Display); - dict.Add(assemblyName, - new DetectedReference(assemblyName, resolvedAssemblyFile, false)); - } else { - dict.Add(assemblyName, - new DetectedReference(assemblyName, reference.Display, false)); - } + string resolvedAssemblyFile = AssemblyFileFinder.FindAssemblyFile(assemblyDef, reference.Display); + dict.Add(assemblyName, + new DetectedReference(assemblyName, resolvedAssemblyFile, false)); } } foreach (var projectReference in parentProject.ProjectReferences) {