MaY*_*YaN 16 .net c# .net-core
我需要一个解决方案来为我提供完整框架和.NET Core的.NET运行时版本.
在具有以下.NET版本的计算机上:
Full: 4.7.2
Core: 2.1.104
Run Code Online (Sandbox Code Playgroud)
运行:
RuntimeInformation.FrameworkDescription
Run Code Online (Sandbox Code Playgroud)
给我:
Full: .NET Framework 4.7.2558.0
Core: .NET Core 4.6.26212.01
Run Code Online (Sandbox Code Playgroud)
运行:
Environment.Version
Run Code Online (Sandbox Code Playgroud)
给我:
Full: 4.0.30319.42000
Core: 4.0.30319.42000
Run Code Online (Sandbox Code Playgroud)
如何知道在Windows之外无法使用注册表选项,我如何准确地获取跨不同平台的运行时版本.
McG*_*V10 18
没有一个统一的方式做到这一点的是,虽然有这个开放的要求在这里,你可以跟踪.如果您点击引用该讨论的各种问题以及下游引用的问题,您会发现现在某些实施中也存在一些错误,但是有积极的工作(其中一个问题有相关的签到8小时前).
对于.NET Framework:
using System;
...
string ver = AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName;
Run Code Online (Sandbox Code Playgroud)
对于.NET Core:
using System.Reflection;
using System.Runtime.Versioning;
...
string ver = Assembly.GetEntryAssembly()?.GetCustomAttribute<TargetFrameworkAttribute>()?.FrameworkName;
Run Code Online (Sandbox Code Playgroud)
输出:
.NETFramework,Version=v4.5.1
.NETCoreApp,Version=v2.0
Run Code Online (Sandbox Code Playgroud)
显然,这些都是以编程方式使用的麻烦,因此需要更好的API(包括微软讨论新API的这个开放性问题,专门针对最小目标框架的测试).
可能永远不可能的另一个难题是给定的应用程序可以引用许多目标.例如,您可能会使用.NET Standard 2.x和.NET Standard 1.x库.我怀疑将会有一个很好的方法来全面了解给定执行组件集合背后的所有目标......
如果您想知道计算机上安装了哪个版本的.NET Framework,则应使用已记录的“发布密钥”注册表项。安装.NET Framework时,该密钥已在系统中注册。
这是公开记录在这里:https : //docs.microsoft.com/en-us/dotnet/framework/migration-guide/versions-and-dependencies
您必须编写将读取该注册表项并将其映射到实际.NET Framework版本的代码。这是针对4.5和4.7.1之间的.NET Framework版本执行此操作的代码。您可以根据需要进一步自定义。(来自https://github.com/dotnet/corefx/blob/master/src/CoreFx.Private.TestUtilities/src/System/PlatformDetection.NetFx.cs#L33)
private static Version GetFrameworkVersion()
{
using (RegistryKey ndpKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"))
{
if (ndpKey != null)
{
int value = (int)(ndpKey.GetValue("Release") ?? 0);
if (value >= 528040)
return new Version(4, 8, 0);
if (value >= 461808)
return new Version(4, 7, 2);
if (value >= 461308)
return new Version(4, 7, 1);
if (value >= 460798)
return new Version(4, 7, 0);
if (value >= 394802)
return new Version(4, 6, 2);
if (value >= 394254)
return new Version(4, 6, 1);
if (value >= 393295)
return new Version(4, 6, 0);
if (value >= 379893)
return new Version(4, 5, 2);
if (value >= 378675)
return new Version(4, 5, 1);
if (value >= 378389)
return new Version(4, 5, 0);
throw new NotSupportedException($"No 4.5 or later framework version detected, framework key value: {value}");
}
throw new NotSupportedException(@"No registry key found under 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' to determine running framework version");
}
}
Run Code Online (Sandbox Code Playgroud)
我知道您说过您不想使用注册表,但是如果您在.NET Framework上运行,则我建议您使用注册表路径(可以通过查看包含程序集的System.Object
加载路径来检测到该注册表路径),因为是推荐和支持的方法(当我们需要检查计算机上安装的版本时,在.NET Runtime中使用相同的方法)。
对于.NET Core,没有您可以检查的注册表项。但是,您可以使用其中包含的程序集的位置System.Object
来标识代码在其上运行的版本。
public static Version GetVersion()
{
string runtimePath = System.IO.Path.GetDirectoryName(typeof(object).Assembly.Location);
// Making the assumption that the path looks like this
// C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.6
string version = runtimePath.Substring(runtimePath.LastIndexOf('\\') + 1);
return new Version(version);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4363 次 |
最近记录: |