Browse Source
Fixed #1164: AddIn opens reference assembly when trying to open symbol in ILSpy
pull/1213/head
Fixed #1164: AddIn opens reference assembly when trying to open symbol in ILSpy
pull/1213/head

5 changed files with 97 additions and 9 deletions
-
3ICSharpCode.Decompiler/DotNetCore/DotNetCorePathFinder.cs
-
32ICSharpCode.Decompiler/DotNetCore/DotNetCorePathFinderExtensions.cs
-
61ILSpy.AddIn/AssemblyFileFinder.cs
-
9ILSpy.AddIn/Commands/OpenILSpyCommand.cs
-
1ILSpy.AddIn/ILSpy.AddIn.csproj
@ -0,0 +1,61 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Text.RegularExpressions; |
||||
|
using ICSharpCode.Decompiler; |
||||
|
using ICSharpCode.Decompiler.Util; |
||||
|
using Mono.Cecil; |
||||
|
|
||||
|
namespace ICSharpCode.ILSpy.AddIn |
||||
|
{ |
||||
|
public class AssemblyFileFinder |
||||
|
{ |
||||
|
public static string FindAssemblyFile(AssemblyDefinition assemblyDefinition, string assemblyFile) |
||||
|
{ |
||||
|
var assemblyName = assemblyDefinition.Name; |
||||
|
|
||||
|
var detectedTargetFramework = assemblyDefinition.DetectTargetFrameworkId(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 ? targetFramework[1] + ".0" : targetFramework[1]; |
||||
|
var dotNetCorePathFinder = new DotNetCorePathFinder(assemblyFile, detectedTargetFramework, version); |
||||
|
file = dotNetCorePathFinder.TryResolveDotNetCore(assemblyName); |
||||
|
if (file != null) |
||||
|
return file; |
||||
|
return FindAssemblyFromGAC(assemblyDefinition); |
||||
|
default: |
||||
|
return FindAssemblyFromGAC(assemblyDefinition); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static string FindAssemblyFromGAC(AssemblyDefinition assemblyDefinition) |
||||
|
{ |
||||
|
return GacInterop.FindAssemblyInNetGac(assemblyDefinition.Name); |
||||
|
} |
||||
|
|
||||
|
static readonly string RefPathPattern = @"NuGetFallbackFolder[/\\][^/\\]+[/\\][^/\\]+[/\\]ref[/\\]"; |
||||
|
|
||||
|
public static bool IsReferenceAssembly(AssemblyDefinition assemblyDef, string assemblyFile) |
||||
|
{ |
||||
|
if (assemblyDef.CustomAttributes.Any(ca => ca.AttributeType.FullName == "System.Runtime.CompilerServices.ReferenceAssemblyAttribute")) |
||||
|
return true; |
||||
|
|
||||
|
// Try to detect reference assembly through specific path pattern
|
||||
|
var refPathMatch = Regex.Match(assemblyFile, RefPathPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); |
||||
|
return refPathMatch.Success; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue