.NET 7 部署变更:多级查找功能已被禁用
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
前言
在 .NET 7 中,微软对 Windows 平台上框架依赖型应用程序的运行时查找机制做出了重要调整。本文将详细解析这一变更的背景、具体内容以及开发者需要采取的应对措施。
变更概述
在 Windows 平台上,面向 .NET 7 或更高版本的框架依赖型应用程序将不再从多个安装位置搜索运行时框架,而是仅从单一位置查找。这一变更旨在解决长期以来多级查找机制带来的各种问题。
历史行为回顾
在 .NET 7 之前的版本中,Windows 平台上的框架依赖型应用程序会按照以下顺序搜索运行时框架:
- 通过 dotnet 命令启动时:搜索 dotnet 可执行文件所在目录的子目录
- 通过应用程序可执行文件(apphost)启动时:
- 首先检查 DOTNET_ROOT 环境变量指定的位置(如果已设置)
- 然后检查注册表中的全局安装位置(HKLM\SOFTWARE\dotnet\Setup\InstalledVersions<arch>\InstallLocation)
- 最后检查默认安装目录(%ProgramFiles%\dotnet 或 %ProgramFiles(x86)%\dotnet)
开发者可以通过设置环境变量 DOTNET_MULTILEVEL_LOOKUP=0 来禁用这一多级查找行为。
.NET 7 的新行为
在 .NET 7 及更高版本中,运行时框架的查找逻辑变得更加严格和明确:
- 通过 dotnet 命令启动时:仅搜索 dotnet 可执行文件所在目录的子目录
- 通过应用程序可执行文件(apphost)启动时:按照以下顺序检查第一个找到 .NET 安装的位置:
- DOTNET_ROOT 环境变量指定的位置(如果已设置)
- 注册表中的全局安装位置(如果已设置)
- 默认安装目录
一旦在上述顺序中找到第一个有效的 .NET 安装位置,搜索就会停止,不再继续检查其他位置。
变更影响范围
- 影响版本:.NET 7 及更高版本
- 变更类型:二进制兼容性变更
- 受影响平台:仅 Windows
变更原因分析
微软做出这一变更主要基于以下考虑:
- 用户体验问题:用户经常困惑为何应用程序会从全局安装位置加载运行时,尽管他们特意使用了私有安装
- 跨平台一致性:Windows 与非 Windows 平台行为不一致
- 自动化系统问题:新的全局 .NET 安装可能意外影响原本隔离的构建和测试环境
- 性能考量:减少不必要的搜索路径可以提升启动性能
开发者应对建议
针对这一变更,开发者需要采取以下措施:
- 确保运行时安装位置:确认所需的 .NET 版本已安装在应用程序期望的单一位置
- 注意错误信息:当启动失败时,错误信息会明确指出运行时查找的预期位置
- 环境变量调整:如有需要,可以设置 DOTNET_ROOT 环境变量明确指定运行时位置
- 部署策略检查:重新评估现有的部署策略,确保与新的查找机制兼容
实际应用示例
假设你有一个 .NET 7 应用程序部署在 D:\MyApp 目录下,并希望使用私有运行时:
- 将 dotnet 运行时安装在 D:\MyApp\dotnet 目录下
- 设置 DOTNET_ROOT=D:\MyApp\dotnet
- 确保没有其他全局安装的 .NET 7 运行时干扰
总结
这一变更虽然带来了行为上的不兼容,但从长远看有助于提高 .NET 应用程序部署的可靠性和可预测性。开发者应当理解新的运行时查找机制,并相应调整部署策略,以确保应用程序能够正确找到所需的运行时环境。
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考