Browse Source

Ensure that System.Runtime is always checked before netstandard

pull/3581/head
ds5678 3 months ago committed by Jeremy Pritts
parent
commit
90f2faf35b
  1. 78
      ICSharpCode.Decompiler/Metadata/DotNetCorePathFinderExtensions.cs

78
ICSharpCode.Decompiler/Metadata/DotNetCorePathFinderExtensions.cs

@ -79,6 +79,19 @@ namespace ICSharpCode.Decompiler.Metadata
return $".NETFramework,Version=v{assemblyDefinition.Version.ToString(2)}"; return $".NETFramework,Version=v{assemblyDefinition.Version.ToString(2)}";
case "netstandard": case "netstandard":
return $".NETStandard,Version=v{assemblyDefinition.Version.ToString(2)}"; return $".NETStandard,Version=v{assemblyDefinition.Version.ToString(2)}";
case "System.Runtime":
case "System.Private.CoreLib":
{
string version = GetDotNetCoreVersion(assemblyDefinition.Version);
if (version != null)
{
return $".NETCoreApp,Version=v{version}";
}
else
{
break;
}
}
} }
} }
@ -95,9 +108,17 @@ namespace ICSharpCode.Decompiler.Metadata
case "mscorlib": case "mscorlib":
version = r.Version.ToString(2); version = r.Version.ToString(2);
return $".NETFramework,Version=v{version}"; return $".NETFramework,Version=v{version}";
case "netstandard": case "System.Runtime":
version = r.Version.ToString(2); case "System.Private.CoreLib":
return $".NETStandard,Version=v{version}"; version = GetDotNetCoreVersion(r.Version);
if (version != null)
{
return $".NETCoreApp,Version=v{version}";
}
else
{
continue;
}
} }
} }
catch (BadImageFormatException) catch (BadImageFormatException)
@ -106,40 +127,17 @@ namespace ICSharpCode.Decompiler.Metadata
} }
} }
// We check for System.Runtime separately because .NET Standard assemblies can reference it transitively, // We check for netstandard separately because .NET Core/Framework assemblies can reference it.
// and we want to avoid detecting .NET Core for .NET Standard assemblies.
foreach (var h in metadata.AssemblyReferences) foreach (var h in metadata.AssemblyReferences)
{ {
try try
{ {
var r = metadata.GetAssemblyReference(h); var r = metadata.GetAssemblyReference(h);
if (r.PublicKeyOrToken.IsNil) if (r.PublicKeyOrToken.IsNil || metadata.GetString(r.Name) is not "netstandard")
continue; continue;
if (metadata.GetString(r.Name) is "System.Runtime" or "System.Private.CoreLib")
{ string version = r.Version.ToString(2);
// System.Runtime.dll uses the following scheme: return $".NETStandard,Version=v{version}";
// 4.1.0 => .NET Core 1.0 / 1.1
// 4.2.0 => .NET Core 2.0
// 4.2.1 => .NET Core 2.1 / 3.0
// 4.2.2 => .NET Core 3.1
// 5.0.0+ => .NET 5+
string version = (r.Version.Major, r.Version.Minor, r.Version.Build) switch {
(4, 1, 0) => "1.1",
(4, 2, 0) => "2.0",
(4, 2, 1) => "3.0",
(4, 2, 2) => "3.1",
( >= 5, _, _) => r.Version.ToString(2),
_ => null
};
if (version != null)
{
return $".NETCoreApp,Version=v{version}";
}
else
{
continue;
}
}
} }
catch (BadImageFormatException) catch (BadImageFormatException)
{ {
@ -196,6 +194,24 @@ namespace ICSharpCode.Decompiler.Metadata
return string.Empty; return string.Empty;
} }
static string GetDotNetCoreVersion(Version assemblyVersion)
{
// System.Runtime.dll and System.Private.CoreLib.dll use the following scheme:
// 4.1.0 => .NET Core 1.0 / 1.1
// 4.2.0 => .NET Core 2.0
// 4.2.1 => .NET Core 2.1 / 3.0
// 4.2.2 => .NET Core 3.1
// 5.0.0+ => .NET 5+
return (assemblyVersion.Major, assemblyVersion.Minor, assemblyVersion.Build) switch {
(4, 1, 0) => "1.1",
(4, 2, 0) => "2.0",
(4, 2, 1) => "3.0",
(4, 2, 2) => "3.1",
( >= 5, _, _) => assemblyVersion.ToString(2),
_ => null
};
}
public static bool IsReferenceAssembly(this MetadataFile assembly) public static bool IsReferenceAssembly(this MetadataFile assembly)
{ {
return IsReferenceAssembly(assembly.Metadata, assembly.FileName); return IsReferenceAssembly(assembly.Metadata, assembly.FileName);

Loading…
Cancel
Save