适用于 VS Code 的 .NET 安装工具扩展提供 dotnet.acquire 用于安装 VS Code 扩展的 .NET 运行时的命令。 从 .NET 安装工具版本 3.0.0 开始,调用 dotnet.acquire 不再始终检查最新运行时版本。 相反,它会使用现有的运行时安装,并在可配置延迟后每天检查更新版本。
已引入的版本
.NET 安装工具 3.0.0
以前的行为
直到 .NET 安装工具版本 3.0.0 或预发行版版本 2.4.1 为止,调用 dotnet.acquire 始终触发检查以查看最新的运行时版本,给定 VS Code 客户端处于联机状态,并且未指定现有路径 dotnet。 如果计算机上没有安装最新的运行时环境,它将被安装,并返回其路径。
此运行时由 C# 开发工具包、C# 和其他 VS Code 扩展(第一方和第三方)用于运行内部 .NET 代码和进程,例如语言服务器主机。 此运行时通常不用于运行用户项目,并且是磁盘上的专用用户文件夹副本。 它可以是运行时或是 aspnetcore 的运行时。
存在类似的命令 dotnet.uninstall 。 以前,如果没有其他扩展依赖于某个 .NET 运行时或 SDK 的安装,该命令会卸载扩展请求的任何 .NET 运行时或 SDK 并递减引用计数。 如果扩展在过去请求了该版本的 .NET,则扩展取决于安装。 基于引用计数的机制允许在没有安装的扩展依赖项时进行卸载。
新行为
从 .NET 安装工具 3.0.0 版本开始,dotnet.acquire 不再始终检查更新的运行时版本,然后再返回与 major.minor 匹配的运行时的路径。 而是使用它之前已安装的现有运行时,并在runtimeUpdateDelaySeconds之后每天检查新运行时。 延迟设置默认为 5 分钟,可在 VS Code 扩展设置中进行更改。 此时间过后,将开始针对更新的运行时版本进行预检查,并在需要时安装新运行时。 之后,所有未使用且不是特定major.minorarchitecture和mode(运行时或 aspnetcore 运行时)组合的最新修补程序的.NET运行时都会被自动卸载。
使用中 意味着 .NET 运行时安装的可执行路径为:
- 通过 .NET 安装工具在 VS Code、VS Code Insiders 或其他 VS Code 变体的任意会话中返回命令。这些会话具有当前活动的运行进程。 这包括但不限于:
dotnet.acquire、dotnet.acquireStatus、dotnet.availableInstalls和dotnet.findPath。 - VS Code 正在运行的
PATH或DOTNET_ROOT环境变量的一部分。
此外, dotnet.uninstall 如果安装被视为 正在使用,则不会卸载。 此命令已经拒绝卸载,因为 dotnet.exe 与该安装文件夹对应的文件句柄有冲突,表明其正在运行或被使用中。 它是否正在使用,是通过尝试使用O_RDONLY权限打开可执行文件或在Windows上用FILE_FLAG_NO_BUFFERING权限打开可执行文件,以及在Unix上通过检查EBUSY、EACCESS或使用lsof查看进程来确定的。
破坏性变更的类型
此更改为行为更改。
更改原因
此更改可提高 .NET 运行时的性能和管理。 它通过将网络调用和安装时间推迟到利用 .NET 的扩展的启动,从而加快开发人员循环的速度。 对于网络中最差的 3% 的用户,他们没有符合任何扩展 .NET 版本要求的自有 .NET 运行时,单是下载时间就导致了 9 到 36 秒的启动延迟。 对于中值用户,这表示 287 毫秒的延迟。
建议的措施
如果您依赖 dotnet.acquire 并想要强制每次使用新的运行时,请在对 dotnet.acquire 的调用中使用 forceUpdate: true。 除非运行时安全补丁、功能或 bug 足够重要以至于需要下载最新的运行时,否则通常不建议这样做。
示例:
const dotnetRuntimePath = (await vscode.commands.executeCommand<IDotnetAcquireResult>(
'dotnet.acquire',
{ version: '9.0', requestingExtensionId, forceUpdate: true }
)).dotnetPath;
确保如果路径不在 PATH 中,您不要在未重新调用 dotnet.availableInstalls 的情况下缓存或重复使用 .NET 安装工具中的任何路径,以演示您在特定会话中使用了安装。
像以前一样继续使用 dotnet.uninstall ,以递减你拥有的安装的引用计数。 但是,由于卸载是在较旧版本被较新版本替换时进行的,因此其重要性降低了。
客户应避免依赖由 .NET 安装工具管理的硬编码专用运行时安装,因为这不是这些运行时的预期用途。 如果有必要的话,请为您的 VS Code 实例设置 PATH 或 DOTNET_ROOT,以防止安装被自动清除。
受影响的 API
没有。