Как я могу настроить код Visual Studio для запуска / отладки .NET (dotnet) Core из подсистемы Windows для Linux (WSL)?

Я установил .NET Core 2.2 в Подсистема Windows для Linux (WSL) и создал новый проект. Я также установил расширение C# для Visual Studio Code, и подсветка синтаксиса и IntelliSense, похоже, работают.

Однако, когда я пытаюсь использовать отладчик, все перестает работать. Вот пошаговое описание того, что я пытался сделать, чтобы его настроить.

Вот мой файл launch.json:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": ".NET Core Launch (console)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            "program": "${workspaceFolder}/bin/Debug/netcoreapp2.2/CodeCore.dll",
            "args": [],
            "cwd": "${workspaceFolder}",
            "console": "internalConsole",
            "stopAtEntry": false,
            "internalConsoleOptions": "openOnSessionStart"
        },
        {
            "name": ".NET Core Launch (web)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            "program": "${workspaceFolder}/bin/Debug/netcoreapp2.2/CodeCore.dll",
            "args": [],
            "cwd": "${workspaceFolder}",
            "stopAtEntry": false,
            "internalConsoleOptions": "openOnSessionStart",
            "launchBrowser": {
                "enabled": true,
                "args": "${auto-detect-url}",
                "windows": {
                    "command": "cmd.exe",
                    "args": "/C start ${auto-detect-url}"
                },
                "osx": {
                    "command": "open"
                },
                "linux": {
                    "command": "xdg-open"
                }
            },
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development"
            },
            "sourceFileMap": {
                "/Views": "${workspaceFolder}/Views"
            }
        },
        {
            "name": ".NET Core Attach",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:pickProcess}"
        }
    ]
}

И мой файл tasks.json:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "command": "dotnet build",
            "type": "shell",
            "group": "build",
            "presentation": {
                "reveal": "silent"
            },
            "problemMatcher": "$msCompile"
        }
    ]
}

Моя структура каталогов:

Как я могу настроить код Visual Studio для запуска / отладки .NET (dotnet) Core из подсистемы Windows для Linux (WSL)?

Но когда я нажимаю кнопку «Начать отладку», я получаю следующую ошибку:

launch: program " does not exist

У вас есть комментарии ВНУТРИ вашего json, обычно это не лучшая идея. Вы можете удалить их и попробовать?

Alexandre Elshobokshy 18.12.2018 11:26

Конечно, я могу это сделать, но они были добавлены VS Code, который сгенерировал базу для этих файлов json. Я скептически отношусь к этому.

Captain Stack 18.12.2018 20:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
2
7 584
1

Ответы 1

На GitHub есть отличная статья на эту тему - Подсистема Windows для Linux.

Короче говоря, вам нужно сначала проверить свою версию после Windows 10 Creators Update:

~$ cat /etc/os-release  | grep  -i version
VERSION = "16.04.2 LTS (Xenial Xerus)"
VERSION_ID = "16.04"
VERSION_CODENAME=xenial

Обратите внимание на следующее:

If you had upgraded to Windows Creators update and already had WSL installed, you might still have Ubuntu 14 in the WSL. If the version is 14, run the following commands in a cmd prompt to reinstall and update WSL.

lxrun /uninstall /full
lxrun /install

Скачайте отладчик:

sudo apt-get install unzip
curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg

Отладчик будет установлен на ~/vsdbg/vsdbg. Это debuggerPath.

Пример конфигурации launch.json для запуска:

  {
           "name": ".NET Core WSL Launch",
           "type": "coreclr",
           "request": "launch",
           "preLaunchTask": "publish",
           "program": "/mnt/c/temp/dotnetapps/wslApp/bin/publish/wslApp.dll",
           "args": [],
           "cwd": "/mnt/c/temp/dotnetapps/wslApp",
           "stopAtEntry": false,
           "console": "internalConsole",
           "pipeTransport": {
               "pipeCwd": "${workspaceRoot}",
               "pipeProgram": "bash.exe",
               "pipeArgs": [ "-c" ],
               "debuggerPath": "~/vsdbg/vsdbg"
           }
       }

Пожалуйста, обрати внимание:

  • /.vscode/launch.json: предоставляет набор различных конфигураций, которые вы можете использовать для запуска вашего приложения. В представлении «Отладка» есть раскрывающийся список для выбора активной конфигурации.
  • <ваша-открытая-папка> /.vscode/tasks.json: это предоставляет набор различных задач, таких как создание вашего приложения, которые вы можете выполнить. Конфигурации отладки могут быть связаны с одной из этих задач через свойство preLaunchTask.

Пример задачи "опубликовать" дляtasks.json(необходимо для запуска):

{
    "version": "2.0.0",
    "tasks": [
        ...,
        {
            "label": "publish",
            "command": "dotnet",
            "type": "process",
            "args": [
                "publish",
                "${workspaceFolder}/wslApp.csproj",
                "-o",
                "${workspaceFolder}/bin/publish"
            ]
        }
    ]
}

Пожалуйста, обрати внимание:

  • preLaunchTask выполняет dotnet publish, который строит проект в Windows. Поскольку coreclr является кроссплатформенным, двоичный файл может быть выполнен на WSL без каких-либо дополнительных действий.

  • pipeProgram установлен на bash.exe.

  • debuggerPath указывает на vsdbg, отладчик coreclr.

  • Это не будет поддерживать программы, которые хотят читать с консоли.

Пример конфигурации launch.json для прикрепления:

 {
           "name": ".NET Core WSL Attach",
           "type": "coreclr",
           "request": "attach",
           "processId": "${command:pickRemoteProcess}",
           "pipeTransport": {
               "pipeCwd": "${workspaceRoot}",
               "pipeProgram": "bash.exe",
               "pipeArgs": [ "-c" ],
               "debuggerPath": "~/vsdbg/vsdbg",
               "quoteArgs": true
           }
       }

Пожалуйста, обрати внимание:

  • "processId": "${command:pickRemoteProcess}" перечисляет процессы, запущенные на WSL с помощью программы конвейера.
  • quoteArgs будет заключать все аргументы и команды отладчика в кавычки с пробелами, если установлено значение true.
  • Используйте sourceFileMap для сопоставления источников, если они доступны в другое место, чем то, где они были построены. Если вы построите свой проект в Linux, обязательно добавьте карту с привода /mnt буквы. Пример: "sourceFileMap": { "/mnt/c/": "c:\\" }
  • Файл и пути в Linux чувствительны к регистру.
lxrun.exe недоступен в последних выпусках Windows 10. Используйте wslconfig.exe /uninstall distro-name.
Biswapriyo 24.12.2018 12:28

Отличная помощь, спасибо, есть ли способ избавиться от жестко запрограммированного /mnt/c/temp/dotnetapps/wslApp и заменить его переменной или специальной командой vscode?

matthid 13.10.2020 12:09

Другие вопросы по теме