Browse Source

Improve parsing of TargetFramework attribute in UniversalAssemblyResolver.

pull/1243/head
Siegfried Pammer 7 years ago
parent
commit
3d68da7237
  1. 8
      ICSharpCode.Decompiler/Metadata/DotNetCorePathFinder.cs
  2. 79
      ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs
  3. 2
      ILSpy.AddIn/AssemblyFileFinder.cs

8
ICSharpCode.Decompiler/Metadata/DotNetCorePathFinder.cs

@ -57,15 +57,13 @@ namespace ICSharpCode.Decompiler.Metadata @@ -57,15 +57,13 @@ namespace ICSharpCode.Decompiler.Metadata
ISet<string> packageBasePaths = new HashSet<string>(StringComparer.Ordinal);
readonly string assemblyName;
readonly string basePath;
readonly string targetFrameworkId;
readonly string version;
readonly Version version;
readonly string dotnetBasePath = FindDotNetExeDirectory();
public DotNetCorePathFinder(string parentAssemblyFileName, string targetFrameworkId, string version, ReferenceLoadInfo loadInfo = null)
public DotNetCorePathFinder(string parentAssemblyFileName, string targetFrameworkId, Version version, ReferenceLoadInfo loadInfo = null)
{
this.assemblyName = Path.GetFileNameWithoutExtension(parentAssemblyFileName);
this.basePath = Path.GetDirectoryName(parentAssemblyFileName);
this.targetFrameworkId = targetFrameworkId;
this.version = version;
var depsJsonFileName = Path.Combine(basePath, $"{assemblyName}.deps.json");
@ -98,7 +96,7 @@ namespace ICSharpCode.Decompiler.Metadata @@ -98,7 +96,7 @@ namespace ICSharpCode.Decompiler.Metadata
}
}
return FallbackToDotNetSharedDirectory(name, new Version(version));
return FallbackToDotNetSharedDirectory(name, version);
}
static IEnumerable<DotNetCorePackageInfo> LoadPackageInfos(string depsJsonFileName, string targetFramework)

79
ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs

@ -67,13 +67,24 @@ namespace ICSharpCode.Decompiler.Metadata @@ -67,13 +67,24 @@ namespace ICSharpCode.Decompiler.Metadata
return directories.ToArray();
}
public string TargetFramework { get; }
enum TargetFrameworkIdentifier
{
NETFramework,
NETCoreApp,
NETStandard,
Silverlight
}
string targetFramework;
TargetFrameworkIdentifier targetFrameworkIdentifier;
Version targetFrameworkVersion;
public UniversalAssemblyResolver(string mainAssemblyFileName, bool throwOnError, string targetFramework,
PEStreamOptions options = PEStreamOptions.Default)
{
this.options = options;
this.TargetFramework = targetFramework ?? string.Empty;
this.targetFramework = targetFramework ?? string.Empty;
(targetFrameworkIdentifier, targetFrameworkVersion) = ParseTargetFramework(this.targetFramework);
this.mainAssemblyFileName = mainAssemblyFileName;
this.baseDirectory = Path.GetDirectoryName(mainAssemblyFileName);
this.throwOnError = throwOnError;
@ -82,6 +93,52 @@ namespace ICSharpCode.Decompiler.Metadata @@ -82,6 +93,52 @@ namespace ICSharpCode.Decompiler.Metadata
AddSearchDirectory(baseDirectory);
}
(TargetFrameworkIdentifier, Version) ParseTargetFramework(string targetFramework)
{
string[] tokens = targetFramework.Split(',');
TargetFrameworkIdentifier identifier;
switch (tokens[0].Trim().ToUpperInvariant()) {
case ".NETCOREAPP":
identifier = TargetFrameworkIdentifier.NETCoreApp;
break;
case ".NETSTANDARD":
identifier = TargetFrameworkIdentifier.NETStandard;
break;
case "SILVERLIGHT":
identifier = TargetFrameworkIdentifier.Silverlight;
break;
default:
identifier = TargetFrameworkIdentifier.NETFramework;
break;
}
Version version = null;
for (int i = 1; i < tokens.Length; i++) {
var pair = tokens[i].Trim().Split('=');
if (pair.Length != 2)
continue;
switch (pair[0].Trim().ToUpperInvariant()) {
case "VERSION":
var versionString = pair[1].TrimStart('v');
if (identifier == TargetFrameworkIdentifier.NETCoreApp ||
identifier == TargetFrameworkIdentifier.NETStandard)
{
if (versionString.Length == 3)
versionString += ".0";
}
if (!Version.TryParse(versionString, out version))
version = null;
break;
}
}
return (identifier, version ?? ZeroVersion);
}
public PEFile Resolve(IAssemblyReference name)
{
var file = FindAssemblyFile(name);
@ -107,25 +164,23 @@ namespace ICSharpCode.Decompiler.Metadata @@ -107,25 +164,23 @@ namespace ICSharpCode.Decompiler.Metadata
public string FindAssemblyFile(IAssemblyReference name)
{
var targetFramework = TargetFramework.Split(new[] { ",Version=v", ",Profile=" }, StringSplitOptions.None);
string file = null;
switch (targetFramework[0]) {
case ".NETCoreApp":
case ".NETStandard":
if (targetFramework.Length < 2)
switch (targetFrameworkIdentifier) {
case TargetFrameworkIdentifier.NETCoreApp:
case TargetFrameworkIdentifier.NETStandard:
if (IsZeroOrAllOnes(targetFrameworkVersion))
goto default;
if (dotNetCorePathFinder == null) {
var version = targetFramework[1].Length == 3 ? targetFramework[1] + ".0" : targetFramework[1];
dotNetCorePathFinder = new DotNetCorePathFinder(mainAssemblyFileName, TargetFramework, version);
dotNetCorePathFinder = new DotNetCorePathFinder(mainAssemblyFileName, targetFramework, targetFrameworkVersion);
}
file = dotNetCorePathFinder.TryResolveDotNetCore(name);
if (file != null)
return file;
goto default;
case "Silverlight":
if (targetFramework.Length < 2)
case TargetFrameworkIdentifier.Silverlight:
if (IsZeroOrAllOnes(targetFrameworkVersion))
goto default;
file = ResolveSilverlight(name, new Version(targetFramework[1]));
file = ResolveSilverlight(name, targetFrameworkVersion);
if (file != null)
return file;
goto default;

2
ILSpy.AddIn/AssemblyFileFinder.cs

@ -30,7 +30,7 @@ namespace ICSharpCode.ILSpy.AddIn @@ -30,7 +30,7 @@ namespace ICSharpCode.ILSpy.AddIn
case ".NETStandard":
if (targetFramework.Length != 2)
return FindAssemblyFromGAC(assemblyDefinition);
var version = targetFramework[1].Length == 3 ? targetFramework[1] + ".0" : targetFramework[1];
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)

Loading…
Cancel
Save