Browse Source

Fix #3349: Get rid of version string manipulation in UniversalAssemblyResolver.ParseTargetFramework.

pull/3350/head
Siegfried Pammer 8 months ago
parent
commit
62cdf38e9b
  1. 10
      ICSharpCode.Decompiler.Tests/ProjectDecompiler/TargetFrameworkTests.cs
  2. 15
      ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs

10
ICSharpCode.Decompiler.Tests/ProjectDecompiler/TargetFrameworkTests.cs

@ -19,6 +19,7 @@
using System; using System;
using ICSharpCode.Decompiler.CSharp.ProjectDecompiler; using ICSharpCode.Decompiler.CSharp.ProjectDecompiler;
using ICSharpCode.Decompiler.Metadata;
using NUnit.Framework; using NUnit.Framework;
@ -119,5 +120,14 @@ namespace ICSharpCode.Decompiler.Tests
// Assert // Assert
Assert.That(targetFramework.Moniker, Is.EqualTo(expectedMoniker)); Assert.That(targetFramework.Moniker, Is.EqualTo(expectedMoniker));
} }
[TestCase(".NETCoreApp, Version=v5.0", TargetFrameworkIdentifier.NET, "5.0.0")]
[TestCase(".NETCoreApp, Version=v10.0", TargetFrameworkIdentifier.NET, "10.0.0")]
public void VerifyUniversalAssemblyResolverParseTargetFramework(string targetFramework, TargetFrameworkIdentifier identifier, string version)
{
var (id, v) = UniversalAssemblyResolver.ParseTargetFramework(targetFramework);
Assert.That(id, Is.EqualTo(identifier));
Assert.That(v.ToString(3), Is.EqualTo(version));
}
} }
} }

15
ICSharpCode.Decompiler/Metadata/UniversalAssemblyResolver.cs

@ -189,15 +189,16 @@ namespace ICSharpCode.Decompiler.Metadata
switch (pair[0].Trim().ToUpperInvariant()) switch (pair[0].Trim().ToUpperInvariant())
{ {
case "VERSION": case "VERSION":
var versionString = pair[1].TrimStart('v', ' ', '\t'); var versionString = pair[1].TrimStart('v', 'V', ' ', '\t');
if (identifier == TargetFrameworkIdentifier.NETCoreApp ||
identifier == TargetFrameworkIdentifier.NETStandard)
{
if (versionString.Length == 3)
versionString += ".0";
}
if (!Version.TryParse(versionString, out version)) if (!Version.TryParse(versionString, out version))
{
version = null; version = null;
}
else
{
version = new Version(version.Major, version.Minor, version.Build < 0 ? 0 : version.Build);
}
// .NET 5 or greater still use ".NETCOREAPP" as TargetFrameworkAttribute value... // .NET 5 or greater still use ".NETCOREAPP" as TargetFrameworkAttribute value...
if (version?.Major >= 5 && identifier == TargetFrameworkIdentifier.NETCoreApp) if (version?.Major >= 5 && identifier == TargetFrameworkIdentifier.NETCoreApp)
identifier = TargetFrameworkIdentifier.NET; identifier = TargetFrameworkIdentifier.NET;

Loading…
Cancel
Save