PAYATHON 2026

如何在 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 已经可以正常调试这个项目,继续使用即可:

  1. 在 VS 2022 中打开同一项目。
  2. 保留 PlatformTarget=x86,如指定了 RID,则使用 win-x86。
  3. 选择项目启动配置,按 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

备注:内容仅供参考。