必须安装.NET SDK而非Runtime,验证dotnet --version和--list-sdks成功,以文件夹方式打开含.csproj的项目,配置正确的launch.json指向编译后.dll,才能在VSCode中正常调试C#代码。

VSCode 装完不能直接写 C#,必须装对 .NET SDK 并让 VSCode 正确识别它——装错组件(比如只装 Runtime)、PATH 没生效、或打开方式不对,dotnet 命令就根本跑不起来,所有后续功能都会失效。
确认装的是 .NET SDK,不是 Runtime
这是最常踩的坑:下载页面上“ASP.NET Core Runtime”“Desktop Runtime”“.NET Runtime”都只是运行已编译程序的环境,不能编译 .cs 文件、不能生成项目、也不能支持调试。C# 开发唯一需要的是带 “SDK” 字样的安装包,例如 dotnet-sdk-8.0.400-win-x64.exe(Windows)、dotnet-sdk-8.0.400-osx-arm64.pkg(macOS)或通过包管理器安装的 dotnet-sdk-8.0(Linux)。
- 验证命令必须全部成功:
dotnet --version输出版本号;dotnet --list-sdks输出类似8.0.400 [C:\Program Files\dotnet\sdk]的行 - Windows 安装器勾选 “将 .NET SDK 添加到 PATH”,装完关掉所有终端再重开
- macOS 用
brew install --cask dotnet-sdk后,务必补一句xcode-select --install,否则dotnet build会报MSB4236 - Linux 用户需额外安装
libicu72和libssl3,否则 CoreCLR 初始化失败
VSCode 必须以文件夹方式打开含 .csproj 的项目
C# 扩展(OmniSharp 或 C# Dev Kit)只在有项目定义文件的目录下激活语言服务。打开单个 Program.cs 文件,状态栏只会显示 “C# features are disabled”,F5 必然失败。
- 正确做法:终端执行
dotnet new console -n MyApp→cd MyApp→code .,然后在 VSCode 中用 File > Open Folder 打开MyApp这一层 - 如果已错开成单个文件:关掉整个 VSCode 窗口,重新以文件夹方式打开
- 右下角状态栏应显示
C# (.NET)或OmniSharp: Ready;若卡在 “Starting…” 超过 2 分钟,大概率是 OmniSharp 下载omnisharp-win-x64.zip失败,可手动删掉%USERPROFILE%\.omnisharp\目录后重试
launch.json 的 program 字段必须指向编译后的 DLL
F5 调试失败最常见的原因是 launch.json 里 program 写成了源码路径,比如 "${workspaceFolder}/Program.cs"。VSCode 调试器只能附加到已编译的托管进程,不是源文件。
- 正确写法示例:
"program": "${workspaceFolder}/bin/Debug/net8.0/MyApp.dll" - 这个路径成立的前提是:
TargetFramework在.csproj中设为net8.0(且与dotnet --list-sdks输出匹配),并且项目已成功构建过一次(dotnet build或首次 F5 会触发) - 如果项目用
global.json锁定了6.0.100,但本地只装了 8.0.400,OmniSharp 会直接退出;要么装对应 SDK,要么删掉global.json
C# Dev Kit 下要关掉 OmniSharp 自动启用
新版 C# Dev Kit 默认仍尝试启动 OmniSharp 进程,但它和 .NET 8+ 的 LSP(Language Server Protocol)模式冲突,导致智能提示缺失、断点不命中、命名空间找不到。
- 打开 VSCode 设置(
Ctrl+,),搜索omnisharp.useGlobalMono→ 设为never - 再搜
csharp.extension.autoStart→ 关掉 - 重启 VSCode,等右下角出现
.NET 8.0.400提示,且状态栏显示C# (LSP)而不是OmniSharp - 如仍异常,按
Ctrl+Shift+P输入C#: Select .NET SDK,手动指定 SDK 路径(例如C:\Program Files\dotnet)
真正卡住的地方往往不在 VSCode 配置,而在 dotnet 是否真就位、项目是否以正确层级打开、以及 launch.json 是否指向真实存在的编译产物——这三个点没对齐,其他设置再全也没用。


















