如何在 VS Code 中运行和调试 x86 .NET 9.0 应用?
结论
在题述环境下,x86 ASP.NET Core 9.0 Web API 可以在 VS Code 的集成终端中运行,但微软 C# 扩展提供的调试器不支持在 Windows 上调试 x86 进程,安装 x86 SDK 也无法改变这一限制。扩展仓库中的相关功能请求仍处于开放状态,维护者建议使用完整的 Visual Studio,或将应用改为以 x64 进程运行。参考:C# 扩展的 x86 调试支持说明
具体选择取决于项目是否必须使用 x86:
- 必须使用 x86:在 VS Code 中编辑、构建和运行,需要断点调试时使用 VS 2022。
- 没有 x86 专属依赖:改为 x64,再在 VS Code 中调试。
为什么同时安装两种 SDK 仍然报错?
SDK 架构、应用架构和调试器支持各自决定不同的事情:
| 配置 | 作用 |
|---|---|
| SDK 架构 | 决定执行构建命令的 dotnet 工具架构 |
| 应用架构 | 决定应用以 x86 还是 x64 进程运行 |
| 调试器支持 | 决定能否附加到目标进程并进行断点调试 |
项目中的这项配置要求程序集在 x86 环境中运行:
<PlatformTarget>x86</PlatformTarget>
x86 SDK 和运行时可以满足构建、运行需求,VS Code 调试器支持哪些目标架构则是另一回事。VS 2022 能调试同一项目,并不代表 VS Code 的调试器也支持这个场景。
Configurations、RunPostBuildEvent 与这条调试错误没有直接关系,无须为此修改。
在 VS Code 中运行 x86 应用
以下命令在 VS Code 的 PowerShell 集成终端中执行,假设当前目录为项目目录,项目文件为 ArshidAPI.csproj,输出程序集名为 ArshidAPI。名称不同时,请按实际情况调整。
1. 检查 x86 运行时
如果 .NET 安装在默认目录,执行:
$dotnetX86 = 'C:\Program Files (x86)\dotnet\dotnet.exe'
& $dotnetX86 --info
& $dotnetX86 --list-runtimes
确认 --info 中的主机架构为 x86,并检查运行时列表是否包含:
Microsoft.NETCore.App 9.0.*
Microsoft.AspNetCore.App 9.0.*
这里的 9.0.* 表示已安装的具体补丁版本,不是命令参数。ASP.NET Core Web API 需要对应架构的 ASP.NET Core 运行时,仅确认机器上安装过 .NET 9 还不够。如果使用了自定义安装目录,请替换上述路径。参考:Windows 上的 .NET 安装说明
2. 明确指定 Windows x86 构建目标
保留原有的 PlatformTarget=x86,构建时指定 win-x86:
dotnet build .\ArshidAPI.csproj -c Debug -r win-x86 --no-self-contained
-r win-x86 指定目标运行平台,--no-self-contained 表示应用依赖机器上已安装的运行时。构建工具本身可以是 x64 SDK,生成 x86 应用无须切换整个系统的 PATH。参考:dotnet build 参数
如果没有自定义输出目录,输出通常位于:
bin\Debug\net9.0\win-x86\
3. 使用 x86 dotnet 启动程序集
$env:ASPNETCORE_ENVIRONMENT = 'Development'
$env:ASPNETCORE_URLS = 'http://localhost:5080'
& $dotnetX86 .\bin\Debug\net9.0\win-x86\ArshidAPI.dll
明确指定 x86 dotnet.exe,可以避免误用 PATH 中的 x64 主机。启动后即可访问项目已有的 API 路由,按 Ctrl+C 停止应用。通过这种方式运行应用,VS Code 中的断点仍不会生效。
直接执行 dotnet ArshidAPI.dll 不会自动应用 Properties\launchSettings.json,所以上例设置了环境和监听地址。如果应用在代码或其他配置中固定了地址,还需要检查相应设置。参考:dotnet run 与直接运行程序集的区别
必须使用 x86 时,如何调试?
当前环境中,VS 2022 已经可以正常调试这个项目,继续使用即可:
- 在 VS 2022 中打开同一项目。
- 保留
PlatformTarget=x86,如指定了 RID,则使用win-x86。 - 选择项目启动配置,按 F5 调试。
也可以先在 VS Code 终端中启动应用,再通过 VS 2022 的“调试 → 附加到进程”附加到对应进程。使用上述命令启动时,目标进程通常显示为 dotnet.exe,需要结合进程 ID 和命令行确认,以免选错。
VS Code 的 attach 使用同一调试器,同样受到 x86 支持限制,无法绕过这条报错。
没有 32 位依赖时,改用 x64 调试
如果项目不依赖只能在 x86 进程中加载的原生 DLL、COM 组件或数据库驱动,可以将项目中的架构配置改为:
<PlatformTarget>x64</PlatformTarget>
如果已经配置了 RuntimeIdentifier,也应改为:
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
RuntimeIdentifier 与 PlatformTarget 必须兼容,不能保留 win-x86 却将 PlatformTarget 改为 x64。参考:NETSDK1032 架构不匹配错误
使用默认安装目录中的 x64 SDK 重新构建:
& 'C:\Program Files\dotnet\dotnet.exe' build .\ArshidAPI.csproj -c Debug -r win-x64 --no-self-contained
构建完成后,可以使用 C# Dev Kit 的项目调试入口。如果手动配置 .vscode/launch.json,可以参考以下基本配置:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug API x64",
"type": "coreclr",
"request": "launch",
"program": "${workspaceFolder}/bin/Debug/net9.0/win-x64/ArshidAPI.exe",
"cwd": "${workspaceFolder}",
"console": "integratedTerminal",
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
]
}
这份配置要求工作区根目录就是项目目录,并且已经执行前面的构建命令;其中没有配置自动构建任务。如果程序集名、目录或输出设置不同,请相应修改 program。参考:VS Code 的 C# 调试入口与配置
需要注意的几点
"targetArchitecture": "x86"不能作为通用修复,配置字段无法补上调试器缺少的 x86 支持。- 将启动目标从
.exe改成.dll不会自动改变进程架构,还要看加载它的dotnet.exe。 - 自包含发布可以解决运行时部署问题,无法解决 VS Code 调试器的 x86 限制。
- 改成 x64 后的调试结果不能替代 x86 验证,尤其是涉及原生组件和内存布局时。
需要确认实际进程位数时,可以临时在启动代码中加入:
Console.WriteLine($"Is64BitProcess: {Environment.Is64BitProcess}");
false 表示当前进程为 32 位。在题述 Windows x64 环境下,按上述 x86 启动方式运行时,结果应为 false。参考:Environment.Is64BitProcess
备注:内容仅供参考。
