【问题标题】:How can I determine if the .Net 5 runtime is installed?如何确定是否安装了 .Net 5 运行时?
【发布时间】:2022-01-27 13:54:51
【问题描述】:

我安装了 .NET 5.0 预览版 SDK 和运行时。

如何检测/确定 .Net 5 运行时是否从 C# 中安装?

【问题讨论】:

  • 因为 5 不是 .NET Framework 版本;最后的。 NET 框架是 4.8
  • 你通常的方式似乎很可疑,但是如果你能解释你想通过这个实现什么
  • dotnet --version
  • @kofifus 我的建议是添加注册表读取代码,而不是让您的问题变成两行。
  • 这(我的意思是经过多次编辑修复后的帖子)怎么没有重点?投票重新开放。更多上下文肯定会有所帮助,但这可能对未来想要完全相同的人有用:检测目标计算机上是否存在 .NET 5 运行时先决条件。

标签: c# .net-5


【解决方案1】:

这里有一些问题:

  1. .NET 5不是 .NET Framework 的一个版本,它是.NET Core 的下一个版本 (source)
  2. 如果您的应用程序是针对 .NET 5 编译的,而您尝试运行的计算机没有安装 .NET 5,那么您的应用程序根本无法启动(将其想象为尝试运行已编译的应用程序对于仅安装了 .NET Framework 3.5 的计算机上的 .NET Framework 4.8)*

由于 .NET 5 是 .NET Core 的下一个版本,您可以轻松使用新的(在 Core 3.0 中)API

var netVersion = System.Environment.Version;
var runtimeVer = System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription;

正如您在原始问题中提到的,您正在阅读注册表项以获取 .NET Framework 版本(我假设是 so)。那么,指定安装的 .NET Core 版本的键的位置位于不同的位置,即HKEY_LOCAL_MACHINE\SOFTWARE\dotnet\Setup\InstalledVersions。以下是您阅读它们的方法:

const string subkey = @"SOFTWARE\dotnet\Setup\InstalledVersions";
var baseKey = Registry.LocalMachine.OpenSubKey(subkey);
if (baseKey.SubKeyCount == 0)
    return;

foreach (var platformKey in baseKey.GetSubKeyNames())
{
    using (var platform = baseKey.OpenSubKey(platformKey))
    {
        Console.WriteLine($"Platform: {platform.Name.Substring(platform.Name.LastIndexOf("\\") + 1)}");
        if (platform.SubKeyCount == 0)
            continue;

        var sharedHost = platform.OpenSubKey("sharedhost");
        foreach (var version in sharedHost.GetValueNames())
            Console.WriteLine("{0,-8}: {1}", version, sharedHost.GetValue(version));
    }
}

* 如果您使用 self-contained 编译您的应用程序,它将与您的应用程序捆绑运行时

【讨论】:

  • 我认为这将返回 SDK 和运行时版本运行当前进程 - 我认为这不是 OP 感兴趣的。OP 正在询问如何检测版本系统上存在 Core SDK(在指定情况下为 v5)。
  • 我不是在寻找 .NET 框架,我想以编程方式了解是否安装了“.NET Runtime 5.0.0-preview.7”
  • and the computer you're trying to run on does not have .NET 5 installed, then your app simply won't launch 这是不正确的,您可以构建一个 self-contained 包,将 .net 与应用程序捆绑在一起。
  • @kofifus 我更新了我的答案以包含列出所有已安装的 .NET Core 版本的代码
  • @kofifus 框架!= .NET 框架。 .NET Core 是一个框架,但不是 .NET Framework
【解决方案2】:

不要使用公认的答案! .NET 5 Core 不再将任何内容保存到注册表中。我安装了 .NET 5,但SOFTWARE\dotnet 的注册表中没有任何内容。

此外,RutimeEnvironment 和类似的基于环境的检查将显示绑定了框架的“自包含”应用程序的无效结果。

检查版本的记录方法是启动dotnet --infodotnet --list-runtimes 并检查结果。有一百万种方法可以启动控制台命令并检查输出。

【讨论】:

    【解决方案3】:

    我正在为 dotnet 产品制作安装程序,我的先决条件之一是安装 dotnet 5.n.n 运行时。我正在几个虚拟机中测试所有场景,这就是我发现的不一致之处。

    在 VM 上,我第一次开始测试时,根本没有 MS-NET 产品,因此很容易通过注册表项 (HKLM/software/dotnet/...) 确定此运行时缺失。但是,当我安装运行时然后卸载它时,注册表项没有被删除(顺便在另一个VM上删除了),所以通过注册表项检查dotnet运行时返回true,但实际上没有安装运行时在机器中,我确实在一分钟前将其卸载。这是我的第一张支票。

    那么,我接下来做了什么(第二次检查)?我确实检查了文件系统中的 dotnet 物理存在。这将是基于 32/64 位安装的 C:\Program Files\dotnet\shared 或 C:\Program Files (x86)\dotnet\shared 位置。请注意,这些文件夹可能包含一个或多个子文件夹,我感兴趣的是这个: Microsoft.NETCore.App -> 拥有核心 + 而不是 5.n.n 运行时...

    第三个检查是运行时的注册表安装/卸载键:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall{guid}

    【讨论】:

      【解决方案4】:

      截至 2021 年 9 月 24 日: 我需要找出安装了哪个版本的 Net 5。我将我的 MS VS 更新到了最新版本,然后创建了简单的控制台 .Net 5 应用程序并从 RuntimeInformation.FrameworkDescription 中获得了价值。它是“.NET 5.0.10”

      更多信息: https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed

      【讨论】:

        【解决方案5】:

        您也可以通过运行 VS 安装程序然后转到修改部分来检查。

        【讨论】:

          【解决方案6】:

          打开 Visual Studio 代码。

          从菜单启动终端

          在终端窗口中键入以下命令并读取版本。

          dotnet --version

          【讨论】:

          • 不要将图片作为链接发布
          • @trentonftw - 删除了链接。请指导如何在我的答案中嵌入图像。
          猜你喜欢
          • 2016-11-28
          • 1970-01-01
          • 1970-01-01
          • 2013-11-02
          • 1970-01-01
          • 1970-01-01
          • 2014-02-11
          • 2021-12-31
          • 2013-02-20
          相关资源
          最近更新 更多