改进 .NET 主机错误消息和可支持性

您是否曾经尝试启动 .NET 应用,但看到一条错误消息,告诉您缺少运行时,如下所示?您是否曾经对缺少SDK的错误消息感到沮丧,但不确定原因?作为 .NET 7 预览版 6 的一部分,我们更新了几条错误消息和命令,以提供更多有用的信息。dotnet --info

作为 .NET 团队,我们经常需要帮助。可支持性对我们来说很重要,因为它有助于节省每个人的时间,并快速让开发人员、操作人员和最终用户解决问题。我们希望错误具有足够的信息,以便许多用户可以自我诊断自己的问题,甚至是非技术用户。我们还希望让独立软件供应商 (ISV) 能够直接为其用户提供支持。其中很大一部分是使错误消息更具信息性,而不会变得复杂。让我们来看看我们为改进 .NET 7 所做的工作。

这篇文章是由 .NET Host 团队共同撰写的。我正在托管托管这篇文章,也是托管团队的成员。我希望我是一个好主人。

上下文

.NET 是一个托管运行时平台。这意味着每个 .NET 应用都由本机主机启动,本机主机需要查找并加载兼容的 .NET 运行时才能执行应用代码。有时找不到运行时,主机需要提供一条错误消息,其中包含错误的详细信息和有关操作的说明。

这篇文章的大部分内容只与依赖于框架的应用程序有关。这是默认的生成和发布选项。依赖于框架的应用(与自包含的应用不同)不包含运行时,但需要从全局安装位置加载一个运行时(通常)。这就是导致整个主题的原因。依赖于框架的应用程序有很多好处,这就是为什么该模型很受欢迎。

某些错误消息包括指向 .NET 网站上各种下载页面的链接。这些链接全天候获得大量流量。这告诉我们,这是一次重要的经历,我们应该更多地投资。我们是。我们对.NET Framework也有类似的经验,这种体验已经存在了很长时间。

缺少运行时

找不到所需的 .NET 运行时的体验对于最终用户和开发人员来说都是一个重要的方案。在错误中,我们试图在最终用户的简单性和开发人员的详细信息之间取得平衡。为了更好地使最终用户能够解决自己的问题,我们专注于确保错误消息既易于理解又可操作。我们更新了格式以提高可读性,删除了不必要的信息,并添加了下载和文档链接。为了使开发人员能够更好地支持其最终用户,我们在错误消息中添加了更多信息,例如体系结构和正在使用的 .NET 位置。

我们更新了错误消息,使其具有一般结构:

Statement about required user action

Relevant information about the scenario

Documentation link

Download link

找不到所需的 .NET 运行时可能意味着根本没有安装 .NET,未安装框架(如 ASP.NET Core 或 Windows Desktop)版本,未安装所需的体系结构,或者未在预期位置。我们将看看其中每一项的体验。

我们还将这些更新向后移植到 .NET 6.0.7。有关缺少运行时的体验非常重要,我们认为在我们最新的LTS版本中进行这些改进对最终用户和开发人员都会有所帮助。

未找到 .NET 安装

首次运行 .NET 应用程序的最终用户可能未安装任何版本的 .NET。在这种情况下,我们希望告诉用户他们需要安装 .NET,并将他们定向到相应的下载页面。

当根本没有安装 .NET 时,运行 .NET 7 应用程序将显示:

You must install .NET to run this application.

App: C:\apps\helloworld\helloworld.exe
Architecture: x64
App host version: 7.0.0-preview.4.22229.4
.NET location: Not found

Learn about runtime installation:
https://aka.ms/dotnet/app-launch-failed

Download the .NET runtime:
https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=win10-x64&apphost_version=7.0.0-preview.4.22229.4

上面的消息指出需要安装 .NET,并且有一个单独的部分来突出显示重要信息,如体系结构和应用主机版本。它还包括一个指向包含更多详细信息的文档的链接,并提供一个下载链接,用户可以按照该链接来解决问题。虽然我们预计大多数用户都可以使用下载链接解决他们的问题,但如果用户需要更多帮助,则其他信息可以提供更好的支持。

对于 Windows GUI 应用程序,我们对显示的错误进行了类似的更改,以包含文档链接并更清楚地列出相关信息:

这些更改是对以前行为的改进:

A fatal error occurred. The required library hostfxr.dll could not be found.
If this is a self-contained application, that library should exist in [C:\apps\helloworld].
If this is a framework-dependent application, install the runtime in the global location [C:\Program Files\dotnet] or use the DOTNET_ROOT environment variable to specify the runtime location or register the runtime location in [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x64\InstallLocation].

The .NET runtime can be found at:
  - https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=win10-x64&apphost_version=6.0.4

未找到所需的框架

另一个常见的最终用户方案是运行一个应用程序,该应用程序需要未安装的框架或未安装该框架的所需版本。在这种情况下,我们希望告诉用户他们需要为 .NET 安装特定的框架,并将他们定向到相应的下载页面。

运行应用程序将显示:

You must install or update .NET to run this application.

App: C:\apps\helloworld\helloworld.exe
Architecture: x64
Framework: 'Microsoft.AspNetCore.App', version '7.0.0-preview.4.22251.1' (x64)
.NET location: C:\Program Files\dotnet

The following frameworks were found:
  5.0.17 at [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]

Learn about framework resolution:
https://aka.ms/dotnet/app-launch-failed

To install missing framework, download:
https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=7.0.0-preview.4.22251.1&arch=x64&rid=win10-x64

该消息有一个单独的部分,用于重要信息,例如缺少的框架的名称 (Microsoft.AspNetCore.App)、版本 (7.0.0-preview.4.22251.1) 和体系结构 (x64) 以及预计安装它的位置。与根本没有安装 .NET 时的错误类似,它具有文档链接和下载链接,供用户解决问题。我们再次希望大多数用户能够通过下载链接解决问题,但包括更详细的信息以确保可支持性。

对于 Windows GUI 应用程序,我们再次对显示的错误进行了类似的更改:

就像在根本不安装 .NET 的情况下一样,包含一个文档链接,并清楚地列出了相关信息。

这些更改是对以前行为的改进:

It was not possible to find any compatible framework version
The framework 'Microsoft.AspNetCore.App', version '7.0.0-preview.4.22251.1' (x64) was not found.
  - The following frameworks were found:
      5.0.17 at [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]

You can resolve the problem by installing the specified framework and/or SDK.

The specified framework can be found at:
  - https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=7.0.0-preview.4.22251.1&arch=x64&rid=win10-x64

建筑

如果未安装相应体系结构的 .NET 运行时,则运行应用程序也可能遇到问题。例如,我们经常在安装了 Arm64 .NET 运行时的 macOS 或 Windows Arm64 计算机上运行 x64 应用程序,但不在 x64 上运行 x64 应用程序,或者在安装了 x64 .NET 运行时的 Windows x64 计算机上运行 x86 应用程序,而不是 x86 计算机。

这表现为没有 .NET 安装或缺少所需的框架,具体取决于是否安装了相应的体系结构。为了帮助解决围绕不同体系结构的问题,该消息现在显示体系结构 – 例如:

Architecture: x64

通常,我们确保有关缺少运行时的所有错误消息都指出相关的体系结构,以便每个人都(最终用户,开发人员或支持最终用户的开发人员)更清楚地了解哪种体系结构是必要的。

我们对 .NET 将 用于支持模拟体系结构的操作系统(在 .NET Core 3.1、.NET 6 和 .NET 7 上)的方式进行了重大更改。.NET 安装将仅更新操作系统的本机体系结构的环境变量。例如,x86(32 位)安装不会更新安装在 64 位计算机上的时间。以前的行为(更新模拟体系结构和本机体系结构 .NET 安装的 )已导致严重的客户混淆和产品中断。挑战在于,旧方案的行为并不总是可预测的。新方案是100%可预测和可靠的。我们在 Arm64 操作系统上的 x64 的 .NET 中进行了相同的更改。PATHPATHPATHPATH

.NET 位置

.NET 应用程序的本机主机根据环境变量、配置文件(在 Unix 上)或注册表项(在 Windows 上)以及已知的默认位置查找 .NET 运行时。您可能实际上安装了所需的 .NET 运行时,但不在应用程序找到的位置。为了便于确定何时可能处于此情况,我们将主机正在使用的 .NET 位置添加到错误消息中。例如,缺少的必需框架消息显示如下内容:

.NET location: C:\Program Files\dotnet

这样,您就可以确切地知道需要将所需框架安装在哪里才能成功启动应用程序。它还允许您验证找到的 .NET 位置是否符合您的期望。如果要使用其他位置,可以使用安装位置搜索中所述的环境变量或注册来更改 .NET 位置。

在 .NET 7 中,我们还禁用了仅限 Windows 的多级查找行为。这意味着 .NET 应用程序宿主不再在多个位置搜索框架。例如,如果已将所需的框架安装到全局注册位置,但环境变量设置为指向没有该框架的安装,则与该值对应的安装将被视为 .NET 位置,并且您将收到一条错误消息,指示在该位置找不到所需的框架。DOTNET_ROOTDOTNET_ROOT

缺少开发工具包

对于 .NET 开发人员来说,运行 .NET SDK 命令是任何开发的切入点。默认情况下,使用安装的最新 SDK,但可以通过 global.json 文件配置特定版本。在 .NET 7 中,如果尝试运行 SDK 命令,但没有安装 global.json 文件指定的版本,则会看到类似于以下内容的错误:

The command could not be loaded, possibly because:
  * You intended to execute a .NET application:
      The application 'build' does not exist.
  * You intended to execute a .NET SDK command:
      A compatible .NET SDK was not found.

Requested SDK version: 7.0.100-preview.4.22252.9
global.json file: C:\apps\global.json

Installed SDKs:
5.0.408 [C:\Program Files\dotnet\sdk]

Install the [7.0.100-preview.4.22252.9] .NET SDK or update [C:\apps\global.json] to match an installed SDK.

Learn about SDK resolution:
https://aka.ms/dotnet/sdk-not-found

在这种情况下,主机无法确定您是尝试运行应用程序还是 SDK 命令,因此在包含有关找不到兼容 SDK 的详细信息以及如何解决故障的说明之前,它提供了这两种可能性。它还包含一个链接,该链接指向有关如何选择 SDK 版本的详细信息。

我们认为措辞和布局使得查看相关细节比以前的行为更容易:

Could not execute because the application was not found or a compatible .NET SDK is not installed.
Possible reasons for this include:
  * You intended to execute a .NET program:
      The application 'build' does not exist.
  * You intended to execute a .NET SDK command:
      A compatible installed .NET SDK for global.json version [7.0.100-preview.4.22252.9] from [C:\apps\global.json] was not found.
      Install the [7.0.100-preview.4.22252.9] .NET SDK or update [C:\apps\global.json] with an installed .NET SDK:
        5.0.408 [C:\Program Files\dotnet\sdk]

有关缺少 SDK 的体验的此更新也已向后移植到 .NET 6.0.7。我们希望新体验能够更轻松地在开发过程中解锁自己。

本机主机还提供了用于 SDK 解析的 API,该 API 用于 MSBuild SDK 解析。在 .NET 7 中,我们更新了该 API 以提供更多信息,例如请求的 SDK 版本。我们计划在这些情况下无法解析 SDK 时,使用该信息提供更好的错误消息。

dotnet --info

dotnet --info 命令打印出有关 .NET 安装和运行它的环境的信息。它可用于自我诊断问题以及在请求支持时提供信息。

在 .NET 7 中,我们将输出更新为:

.NET SDK:
  Version:   7.0.100-preview.6.22315.18
  Commit:    2b75d9ffff

Runtime Environment:
  OS Name:     Windows
  OS Version:  10.0.22000
  OS Platform: Windows
  RID:         win10-x64
  Base Path:   C:\Program Files\dotnet\sdk\7.0.100-preview.6.22315.18

Host:
  Version:      7.0.0-preview.6.22316.1
  Architecture: x64
  Commit:       3fc61ebb56

.NET SDKs installed:
  7.0.100-preview.6.22315.18 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 7.0.0-preview.6.22316.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 7.0.0-preview.6.22316.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 7.0.0-preview.6.22314.4 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
  x86   [C:\Program Files (x86)\dotnet]
    registered at [HKLM\SOFTWARE\dotnet\SetupInstalled\Versions\x86\InstallLocation]

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download

根据错误消息更新,我们清理了布局,删除了不必要的文本,并添加了文档链接。我们还包含了主机体系结构和用于 SDK 解析的任何 global.json。

如前所述,由于使用了不同的体系结构或 .NET 位置,我们看到了混乱。为了帮助理解此类问题,我们进行了更新,以列出其他体系结构的安装(包括它们的位置,以及它们的注册方式(如果适用))以及影响本机主机查找 .NET 运行时的任何环境变量。dotnet --infoDOTNET_ROOT

这是之前的输出:

.NET SDK (reflecting any global.json):
 Version:   6.0.300
 Commit:    8473146e7d

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.19044
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\6.0.300

Host (useful for support):
  Version: 6.0.5
  Commit:  70ae3df4a6

.NET SDKs installed:
  6.0.300 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 6.0.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 6.0.5 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 6.0.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

To install additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download

开发工具包错误消息

我们发现了一些 SDK 错误消息,这些错误消息引用了其位置,但未指定其位置。这可能非常令人沮丧。我们希望在以后的预览版中改进这种体验。global.json

点网图标

为了响应社区的一个很好的建议,我们还在Windows上的可执行文件中添加了一个图标。现在,您将看到的不是默认的 Windows 应用程序图标:dotnet

点网可执行图标

网站

.NET 网站是下载链接的目标。这些链接包括一些信息,例如需要哪种体系结构和 .NET 版本。目前,该网站将用户带到特定于版本的页面,例如.NET 7。但是,用户需要在多个下载之间进行选择。

展望未来,我们计划更新网站,以便从这些链接提供单个下载。它应与请求的操作系统、体系结构和 .NET 版本匹配。这样,所有用户(技术或非技术)都可以获得简单的点击式体验,而无需任何特殊知识。

总结

我们付出了巨大的努力来提高所有这些错误和信息“屏幕”的可用性和可支持性。我们必须定期支持我们的产品,我们相信额外的信息将对我们非常有帮助。我们希望它对你有所帮助,无论你是开发人员、运营专业人员还是最终用户。

在一天结束时,你只想安装 .NET,以便可以运行应用或进行一些开发。我们希望我们已经使这个过程更快,更容易一些。

给TA打赏
共{{data.count}}人
人已打赏
.NET

Entity Framework 支持策略

2022-6-22 10:28:59

.NET

.NET6之Mini API【一、开始Mini API】

2022-6-24 11:33:38

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索