如何以编程方式找到.NET运行时的版本?

时间:2018-04-10 10:00:26

标签: c# .net .net-core

我需要一个解决方案来为我提供完整框架和 .NET Core .NET 运行时版本。

在具有以下 .NET 版本的计算机上:

Full: 4.7.2
Core: 2.1.104

运行:

RuntimeInformation.FrameworkDescription

给我:

Full: .NET Framework 4.7.2558.0
Core: .NET Core 4.6.26212.01

运行:

Environment.Version

给我:

Full: 4.0.30319.42000
Core: 4.0.30319.42000

如何知道在 Windows 之外无法使用注册表选项,我是如何准确获取不同平台上的运行时版本的。

2 个答案:

答案 0 :(得分:10)

目前还没有一种统一的方法可以做到这一点,尽管您可以跟踪此here的公开请求。如果您点击引用该讨论的各种问题以及下游引用的问题,您现在看到某些实施中也存在一些错误,但是有积极的工作(其中一个问题有相关的检查 - 仅用了8个小时)。

对于.NET Framework:

using System;
...
string ver = AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName;

和.NET Core:

using System.Reflection;
using System.Runtime.Versioning;
...
string ver = Assembly.GetEntryAssembly()?.GetCustomAttribute<TargetFrameworkAttribute>()?.FrameworkName;

输出:

.NETFramework,Version=v4.5.1
.NETCoreApp,Version=v2.0

显然,这些是以编程方式使用的麻烦,因此请求更好的API(包括来自Microsoft的this开放式问题讨论新API,专门针对最小目标框架的测试。)

可能永远不可能的另一个难题是给定的应用程序可以引用许多目标。例如,您可能会使用.NET Standard 2.x和.NET Standard 1.x库。我怀疑将会有一个很好的方法来获得给定执行程序集集合后面的所有目标的完整图片......

答案 1 :(得分:3)

如果您想知道计算机上安装了哪个版本的.NET Framework,您应该使用记录在案的发布密钥&#39;注册表项。安装.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 >= 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");
        }
    }

我知道您说您不想使用注册表,但是如果您在.NET Framework上运行,我建议您使用注册表路径(您可以通过查看包含{的程序集的路径来检测它{1}}从中加载,因为这是推荐和支持的方式(当我们需要检查计算机上安装的版本时,我们在.NET运行时内使用相同的方法。)

对于.NET Core,您无需检查注册表项。但是,您可以使用包含System.Object的程序集的位置来标识运行代码的版本。

System.Object