改进.NET主机错误信息和支持性背景及应对方案

560 阅读13分钟

你是否曾经试图启动一个.NET应用程序,看到一个错误信息,告诉你缺少一个运行时,就像下面这样?你是否曾被一条错误信息所困扰,说你缺少一个SDK,但又不确定原因?作为.NET 7预览6的一部分,我们已经更新了一些错误信息和命令,如dotnet --info ,以提供更多有用的信息。

App launch error message

作为.NET团队,我们经常被要求提供帮助。可支持性对我们来说很重要,因为它有助于节省每个人的时间,并迅速让开发人员、操作人员和终端用户解决一个问题。我们希望错误有足够的信息量,使许多用户能够自我诊断他们自己的问题,甚至是非技术性用户。我们也想让独立软件供应商(ISVs)能够直接支持他们的用户。这方面的一个重要部分是使错误信息更加丰富而不复杂。让我们来看看我们为改进.NET 7做了什么。

背景介绍

.NET是一个托管的运行时平台。这意味着每个.NET应用都是由一个本地主机启动的,它需要找到并加载一个兼容的.NET运行时来执行应用代码。有时找不到运行时,主机需要提供一个错误信息,包括错误的细节和如何处理的说明。

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

一些错误信息包括一个指向.NET网站上各种下载页面的链接。这些链接得到了大量的流量,昼夜不停。这告诉我们,这是一个重要的经验,我们应该在这方面投入更多。我们就是这样。我们对.NET框架也有一个类似的体验,已经存在了很长时间了。

缺少的运行时间

当无法找到所需的.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:appshelloworldhelloworld.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应用程序,我们对显示的错误做了类似的修改,以包括一个文档链接,并更清楚地列出相关信息。

.NET install not found - 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:appshelloworld].
If this is a framework-dependent application, install the runtime in the global location [C:Program Filesdotnet] or use the DOTNET_ROOT environment variable to specify the runtime location or register the runtime location in [HKLMSOFTWAREdotnetSetupInstalledVersionsx64InstallLocation].

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 install not found - old GUI

未找到所需的框架

另一个常见的终端用户场景是运行一个需要框架的应用程序,但该框架没有安装或所需的版本没有安装。在这种情况下,我们要告诉用户,他们需要安装一个特定的.NET框架,并引导他们到相应的下载页面。

运行该应用程序会显示:

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

App: C:appshelloworldhelloworld.exe
Architecture: x64
Framework: 'Microsoft.AspNetCore.App', version '7.0.0-preview.4.22251.1' (x64)
.NET location: C:Program Filesdotnet

The following frameworks were found:
  5.0.17 at [C:Program FilesdotnetsharedMicrosoft.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应用程序,我们再次对显示的错误进行了类似的修改。

Required framework not found - 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 FilesdotnetsharedMicrosoft.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

Required framework not found - old GUI

架构

如果没有安装相应架构的.NET运行时,你也可能遇到运行应用程序的问题。例如,我们经常看到这样的情况:在macOS或Windows Arm64机器上运行x64应用程序,其中安装了Arm64的.NET运行时间,但没有安装x64的;在Windows x64机器上运行x86应用程序,其中安装了x64的.NET运行时间,但没有安装x86的。

这表现为没有安装.NET缺少所需的框架,这取决于是否有相应架构的任何安装。为了帮助解决不同架构的问题,信息现在显示了架构——例如:

Architecture: x64

一般来说,我们确保所有关于缺少运行时的错误信息都指出相关的架构,这样对每个人--终端用户、开发者或支持终端用户的开发者--都更清楚哪个架构是必要的。

我们对支持仿真架构的操作系统(在.NET Core 3.1、.NET 6和.NET 7上)的.NET使用PATH 的方式做了一个突破性改变。.NET安装将只为操作系统的本地架构更新PATH 环境变量。例如,x86(32位)安装在64位机器上时,将不会更新PATH 。以前的行为(为模拟架构和本地架构的.NET安装更新PATH )已经造成了重大的客户混乱和产品损坏。挑战在于,旧方案的行为并不总是可预测的。新方案是100%可预测和可靠的。我们在Arm64操作系统上的.NET for x64也做了同样的改变。

.NET的位置

.NET应用程序的本地主机根据环境变量、配置文件(在Unix上)或注册表键(在Windows上)以及众所周知的默认位置来寻找.NET运行时间。你实际上可能已经安装了所需的.NET运行时间,但不是在应用程序找到的位置。为了便于确定你何时可能处于这种情况,我们在错误信息中增加了主机正在使用的.NET位置。例如,缺少所需框架的信息显示如下:

.NET location: C:Program Filesdotnet

这让你知道所需的框架需要安装在哪里,以便成功启动应用程序。它还允许你验证找到的.NET位置是否符合你的期望。如果你想使用一个不同的位置,你可以使用环境变量或安装位置搜索中描述的注册来改变.NET的位置。

在.NET 7中,我们还禁用了仅适用于Windows的多级查找行为(见突破性变化通知)。这意味着.NET应用程序主机不再在多个位置搜索框架。例如,如果你将所需的框架安装在全局注册的位置,但DOTNET_ROOT 环境变量被设置为指向没有该框架的安装位置,那么与DOTNET_ROOT 值对应的安装位置将被视为.NET位置,你将得到一个错误信息,表明在该位置没有找到所需的框架。

缺少SDK

对于.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:appsglobal.json

Installed SDKs:
5.0.408 [C:Program Filesdotnetsdk]

Install the [7.0.100-preview.4.22252.9] .NET SDK or update [C:appsglobal.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:appsglobal.json] was not found.
      Install the [7.0.100-preview.4.22252.9] .NET SDK or update [C:appsglobal.json] with an installed .NET SDK:
        5.0.408 [C:Program Filesdotnetsdk]

围绕SDK缺失的体验的这一更新也被回传到了.NET 6.0.7。我们希望新的体验能让你在开发过程中更容易解除障碍。

本地主机也提供了一个SDK解析的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 Filesdotnetsdk7.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 Filesdotnetsdk]

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

Other architectures found:
  x86   [C:Program Files (x86)dotnet]
    registered at [HKLMSOFTWAREdotnetSetupInstalledVersionsx86InstallLocation]

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位置而造成的混乱。为了帮助理解这些问题,我们更新了dotnet --info ,以列出其他架构的安装情况--包括它们的位置,如果适用,它们是如何注册的--以及任何影响本地主机寻找.NET运行时的DOTNET_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 Filesdotnetsdk6.0.300

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

.NET SDKs installed:
  6.0.300 [C:Program Filesdotnetsdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 6.0.5 [C:Program FilesdotnetsharedMicrosoft.AspNetCore.App]
  Microsoft.NETCore.App 6.0.5 [C:Program FilesdotnetsharedMicrosoft.NETCore.App]
  Microsoft.WindowsDesktop.App 6.0.5 [C:Program FilesdotnetsharedMicrosoft.WindowsDesktop.App]

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

SDK错误信息

我们发现一些SDK的错误信息提到了global.json ,但没有指明其位置。这可能是一个超级令人沮丧的问题。我们希望在以后的预览版中能改善这种体验

dotnet图标

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

dotnet executable icon

网站

.NET网站是下载链接的目标。这些链接包括一些小的信息,如需要哪个架构和.NET版本。目前,该网站将用户带到一个特定版本的页面,如.NET 7。然而,用户需要在多种下载中进行选择。

今后,我们计划更新网站,以便从这些链接中提供一个单一的下载。它应该与请求的操作系统、架构和.NET版本相匹配。这样,所有的用户(技术或非技术)都有一个简单的点击就走的体验,而不需要任何特殊的知识。

总结

我们已经做了很大的努力来提高所有这些错误和信息 "屏幕 "的可用性和可支持性。我们必须定期支持我们的产品,我们相信额外的信息将对我们很有帮助。我们希望它对你有帮助,无论你是开发人员、专业操作人员,还是最终用户。

说到底,你只是想把.NET安装好,以便你能运行一个应用程序或进行一些开发。我们希望,我们已经使这个过程变得更快、更容易。