dotnet run 报找不到 runtime 的根本原因是项目 .csproj 中的 (如 net6.0)要求对应版本的 microsoft.netcore.app 运行时,而本地仅安装了 sdk(如 net8.0)并未安装匹配的 runtime;sdk 与 runtime 独立,需单独安装 dotnet-runtime-6.0 等对应版本才能解决。

为什么 dotnet run 会报错说找不到 Runtime?
不是项目写错了,也不是 VSCode 崩了——而是 dotnet run 在执行时,悄悄按 .csproj 里硬编码的 <targetframework></targetframework> 去找对应版本的 Runtime。比如你项目写着 <targetframework>net6.0</targetframework>,但本地只装了 net8.0 SDK,dotnet CLI 就会去查有没有 net6.0 Runtime,查不到就报 The specified framework 'Microsoft.NETCore.App', version '6.0.0' was not found。
-
dotnet --list-runtimes输出里必须包含匹配的Microsoft.NETCore.App 6.0.x或Microsoft.AspNetCore.App 6.0.x(取决于项目类型) - 只装 SDK 不等于自动装齐所有旧版 Runtime;SDK 是开发工具包,Runtime 是运行时环境,二者可独立安装
- Unity 项目尤其容易踩坑:Unity 2021 LTS 默认绑定
net6.0,但开发者常只装最新 SDK(如net8.0),导致dotnet run失败、VSCode 调试器启动卡住
global.json 能绕过硬编码,但用法很脆
global.json 的作用不是“覆盖 .csproj”,而是告诉 dotnet CLI:“在这个目录及子目录下,优先用这个 SDK 版本”。它只影响 SDK 分辨逻辑,不影响 Runtime 绑定——也就是说,即使 global.json 指定了 "version": "8.0.400",只要 .csproj 还是 net6.0,运行时仍要 net6.0 Runtime。
- 位置必须严格:放在工作区根目录,且文件名就是
global.json(不能叫global.config或带空格) - 内容格式必须精确:
{"sdk": {"version": "8.0.400"}},多一个逗号或少一个引号都会让整个文件失效 - 它不解决 Runtime 缺失问题,只解决 SDK 版本歧义;想跑
net6.0项目,还得额外装dotnet-runtime-6.0
VSCode 的 C# 扩展怎么“看” Runtime?
C# Dev Kit 和 OmniSharp 都不直接读 .csproj 的 TargetFramework 来决定用哪个 Runtime,它们依赖 dotnet --list-runtimes 的输出结果做预检。如果输出为空,或没包含目标框架,就会触发 .NET Install Tool 自动下载——这就是你看到 “Downloading .NET version(s) 6.0.30” 却总失败的根源。
- 检查方式:打开 Output 面板 → 切换到
.NET Install Tool→ 看日志里是否出现No matching runtime found for net6.0 - 修复动作不是改 settings.json,而是补装缺失 Runtime:
sudo apt install dotnet-runtime-6.0(Ubuntu)、brew install --cask dotnet-runtime-6.0(macOS)、Windows 去 dotnet.microsoft.com/download/dotnet/6.0 下 Runtime 安装包 - 别信“装了 SDK 就够了”——
dotnet --list-sdks和dotnet --list-runtimes必须各自有输出,且版本号能对上项目需求
Unity 项目里最隐蔽的 Runtime 绑定点
Unity 生成的 .csproj 文件通常由 Unity Editor 自动生成,TargetFramework 值取决于 Unity 版本和 Player Settings 中的 ".NET Profile"。但很多人不知道:Unity 还会在 Assets/Plugins/Editor/ 下放一个 Microsoft.NET.Sdk 引用,它会强制拉取特定版本的 SDK 工具链,进而影响 Runtime 查找路径。
- 典型症状:VSCode 能识别 C# 语法,但 F5 启动调试器时弹出
Could not find a compatible .NET SDK installed,哪怕dotnet --list-sdks显示正常 - 排查重点:打开
ProjectSettings/ProjectSettings.asset,搜索dotNetProfile,确认值是NET_6_0还是NET_STANDARD_2_1;后者不依赖具体 Runtime,前者必须匹配 - 临时绕过:在 Unity Editor 中把 Scripting Runtime Version 改成
.NET Standard 2.1,再重新生成项目文件,可避开硬编码 Runtime 依赖











