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

Я установил dotnet core 2.2 в подсистему Windows для Linux (WSL) и создал новый проект.Я также установил расширение C # для кода Visual Studio, и подсветка синтаксиса и 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"
        }
    ]
}

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

enter image description here

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

launch: program " does not exist

1 Ответ

0 голосов
/ 24 декабря 2018

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

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

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

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

Если вы обновились до обновления Windows Creators и уже установили WSL, возможно, Ubuntu 14 по-прежнему установлен вWSL.Если версия 14, выполните следующие команды в командной строке cmd для переустановки и обновления 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.

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

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

Обратите внимание :

  • preLaunchTask выполняет публикацию dotnet, которая создает проект на 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 с использованием каналаprogram.
  • quoteArgs будет заключать в кавычки любые аргументы и команды отладчика с пробелами, если установлено значение true.
  • Используйте sourceFileMap для сопоставления источников, если они доступны в другом месте, отличном от того, где они быливстроенный.Если вы строите свой проект в Linux, обязательно добавьте карту из букв /mnt.Пример: "sourceFileMap": { "/mnt/c/": "c:\\" }
  • Файл и пути чувствительны к регистру в Linux.
...