web-dev-qa-db-fra.com

Comment puis-je configurer Visual Studio Code pour exécuter / déboguer .NET (dotnet) Core à partir du sous-système Windows pour Linux (WSL)?

J'ai installé dotnet core 2.2 dans le sous-système Windows pour Linux (WSL) et créé un nouveau projet. J'ai également installé l'extension C # pour Visual Studio Code et la coloration syntaxique et IntelliSense semblent fonctionner.

Cependant, lorsque j'essaie d'utiliser le débogueur, les choses cessent de fonctionner. Voici une étape par étape de ce que j'ai essayé de faire pour le configurer.

Voici mon 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}"
        }
    ]
}

Et mes tâches.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"
        }
    ]
}

Ma structure de répertoires:

enter image description here

Mais lorsque je clique sur le bouton "Démarrer le débogage", j'obtiens l'erreur suivante:

launch: program " does not exist
10
Captain Stack

Il y a un excellent article sur github concernant le sujet - Sous-système Windows pour Linux .

Pour résumer une longue histoire, vous devez d'abord vérifier votre version après la mise à jour des créateurs de Windows 10:

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

Remarquez ce qui suit :

Si vous aviez mis à niveau vers la mise à jour Windows Creators et que WSL était déjà installé, vous pourriez toujours avoir Ubuntu 14 dans le WSL. Si la version est 14, exécutez les commandes suivantes dans une invite cmd pour réinstaller et mettre à jour WSL.

lxrun /uninstall /full
lxrun /install

Téléchargez le débogueur :

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

Le débogueur sera installé à ~/vsdbg/vsdbg, c'est le debuggerPath.

Exemple de configuration launch.json pour le lancement :

  {
           "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"
           }
       }

Notez s'il vous plaît:

  • /.vscode/launch.json: cela fournit un tableau de différentes configurations que vous pouvez utiliser pour lancer votre application. Il y a une liste déroulante dans la vue Débogage pour sélectionner la configuration active.
  • /.vscode/tasks.json: cela fournit un tableau de différentes tâches, comme la construction de votre application, que vous pouvez exécuter. Les configurations de débogage peuvent être liées à l'une de ces tâches via la propriété preLaunchTask.

Exemple de tâche 'publier' pour tasks.json (nécessaire pour le lancement) :

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

Veuillez noter :

  • preLaunchTask exécute la publication dotnet, qui construit le projet sur Windows. Puisque coreclr est multiplateforme, le binaire peut être exécuté sur WSL sans aucun travail supplémentaire.

  • pipeProgram est défini sur bash.exe.

  • debuggerPath pointe vers vsdbg, le débogueur coreclr.

  • Cela ne prendra pas en charge les programmes qui souhaitent lire à partir de la console.

Exemple de configuration launch.json pour l'attachement :

 {
           "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
           }
       }

Veuillez noter :

  • "processId": "${command:pickRemoteProcess}" répertorie les processus exécutés sur WSL à l'aide du programme pipe.
  • quoteArgs citera tous les arguments et commandes de débogueur avec des espaces s'ils sont définis sur true.
  • Utilisez sourceFileMap pour mapper les sources si elles sont disponibles dans un emplacement différent de celui où elles ont été créées. Si vous construisez votre projet sous Linux, assurez-vous d'ajouter une carte à partir de /mnt lettres de lecteur. Exemple: "sourceFileMap": { "/mnt/c/": "c:\\" }
  • Les fichiers et les chemins sont sensibles à la casse sous Linux.
4
Barr J