VSCode launch.json 使用 dotnet watch / 热重载运行 C# 项目

VSCode launch.json to run C# project with dotnet watch / hot reload

提问人:Tapani Talvitie 提问时间:10/31/2023 最后编辑:Tapani Talvitie 更新时间:10/31/2023 访问量:101

问:

我有一个 dotnet C# 项目,我喜欢测试我的源代码更改,而无需每次都手动构建和启动程序。为了实现这一点,我可以在终端中使用命令手动运行程序。但我也希望能够通过按 F5(开始调试)和/或 Ctrl+F5(运行而不调试)轻松地从 VSCode 启动。dotnet watchdotnet watch

尝试的解决方案

首先尝试
首先,我认为在launch.json中可能会解决问题:
"args": ["watch"]

    {
        "name": "App1 launch",
        "type": "coreclr",
        "request": "launch",
        "preLaunchTask": "App1 build",
        "program": "${workspaceFolder}/App1/bin/Debug/net7.0/App1.dll",
        "args": ["watch"],
        "cwd": "${workspaceFolder}/App1",
        "stopAtEntry": false,
    },

结果
有额外的参数没有改变行为。having 在启动期间执行并忽略 watch 参数。
"type": "coreclr"dotnet exec

第二次尝试
接下来,我按照线程 https://stackoverflow.com/questions/59830506/how-to-setup-an-auto-watch-run-for-net-core-3-1-projects-using-visual-studio-co 中描述的说明进行操作,最终在launch.json中进行了以下配置:

    {
        "name": "App1 launch",
        "type": "coreclr",
        "request": "launch",
        "preLaunchTask": "App1 watch",
        "program": "${workspaceFolder}/App1/bin/Debug/net7.0/App1.dll",
        "args": [],
        "cwd": "${workspaceFolder}/App1",
        "stopAtEntry": false,
    },

以及tasks.json中的以下任务:

    {
        "label": "App1 watch",
        "command": "dotnet",
        "type": "process",
        "args": [
            "watch",
            "run",
            "${workspaceFolder}/App1/App1.csproj",
            "/property:GenerateFullPaths=true",
            "/consoleloggerparameters:NoSummary"
        ],
        "problemMatcher": "$msCompile",
        "options": {
            "cwd": "${workspaceFolder}/App1/"
        },
    },

结果

  1. 任务 App1 监视在启用热重载的情况下运行,如预期的那样dotnet watch
  2. VSCode 终端有预启动任务 App1 watch 等待 Ctrl+C,因此实际启动尚未发生,不良行为
  3. 在终端中手动终止预启动任务后,App1 启动会使用“dotnet exec”命令重新启动应用程序,这显然是不希望的行为

结论

我还尝试了其他几种不值得一提的方法。目前似乎不可能在 VSCode 中获得所需的行为。

因此,对于我自己的项目,我编写了这个简单的指南作为最简单的解决方法:

  1. 打开现有终端或新终端(如果在 VSCode 中执行此操作,请注意,您可以在 VSCode 中同时打开多个终端,这在使用多项目工作区时非常方便)
  2. 导航到项目文件夹(在此示例中导航到 App1 文件夹)
  3. 在终端中,执行命令:dotnet watch
  4. 如果你想在 VSCode 中附加进程(注意:这需要在对源代码进行任何更改之前完成,否则它将不起作用),您可以通过以下方式完成:
    1. 从左侧菜单中选择“运行并调试”
    2. 从下拉列表“App1 Attach”中选择
    3. 按播放按钮 请注意,在进行源更改后,观察程序会自动重新启动 App1.dll(热重载),因此您需要再次重新附加进程:-/
  5. 当您要停止运行 App1 时,请在终端中按 Ctrl+C

上面的可选步骤 #4 假定您拥有包含以下配置的launch.json

    {
        "name": "App1 attach",
        "type": "coreclr",
        "request": "attach",
        "processName":"App1.dll"
    },

这种解决方法也有一个缺点:当您进行源更改时,热重载将重新启动应用程序,您需要重新连接它。但请注意,您可能根本不需要每次都连接。在紧张的开发过程中,我主要通过遵循终端中的简单错误消息来生存,并享受热重载为我提供的快速实现测试迭代。

最后的话
我决定为每个人写下这个,因为我花了太多时间试图找出最佳解决方案。似乎需要一个改进的调试器(一个可以正确执行监视参数并在每次热重新加载后自动重新附加进程的调试器)才能获得最佳解决方案。但是,如果您设法找到可行的解决方案,请告诉我和其他人!

注意
上面的示例假定 VSCode 工作区的文件夹 App1 中有一个名为 App1 的项目。launch.jsontasks.json应存储在 .vscode 文件夹中。

在上面的例子中,我有以下设置:

  • Visual Studio 代码:1.83.1

  • 已安装的 .NET SDK:7.0.403.NET SDK.NET SDKs installed: 7.0.403

  • 已安装的 .NET 运行时:

    • Microsoft.AspNetCore.App 7.0.13

    • Microsoft.NETCore.App 7.0.13

    • Microsoft.WindowsDesktop.App 7.0.13

  • 运行环境:

    • 操作系统名称:Windows 操作系统

    • 版本: 10.0.22621

C# .NET VSCode-debugger 监视 热重载

评论


答: 暂无答案