Share via


Depuración de aplicaciones .NET en WSL con Visual Studio

Puede ejecutar y depurar fácilmente sus aplicaciones de .NET Core y .NET 5+ en Linux sin salir de Visual Studio mediante WSL. Si es un desarrollador multiplataforma, puede usar este método como una forma sencilla de probar más sus entornos de destino.

Para un usuario de Windows .NET que tiene como destino Linux, WSL representa un punto óptimo entre la productividad y el realismo de la producción. En Visual Studio, puede depurar en un entorno remoto de Linux mediante el depurador remoto, o bien con contenedores mediante las herramientas de contenedor. Si el realismo de la producción es su principal preocupación, debe usar una de las opciones anteriores. Cuando le preocupa más tener un bucle interno sencillo y rápido, WSL es una opción excelente.

No tiene por qué elegir solo un método. Puede tener un perfil de inicio para Docker y otro para WSL en el mismo proyecto y elegir el más adecuado para cada ejecución. Una vez implementada la aplicación, siempre puede usar el depurador remoto para asociarla si hay algún problema.

Nota

A partir de Visual Studio 2019 versión 16.11 Preview 3, el destino de depuración de WSL 2 se cambió a WSL.

Requisitos previos

  • Visual Studio 2019, versión 16.9 Preview 1 o versiones posteriores, con la depuración de .NET con el componente opcional para WSL.

    Para buscar el componente para WSL, seleccione Herramientas>Get Tools and Features (Obtener herramientas y características). En la Instalador de Visual Studio, asegúrese de que el componente está instalado. Para ello, seleccione la pestaña Componentes individuales y escriba WSL como término de búsqueda.

    En algunas versiones de Visual Studio, el componente opcional se incluye de forma predeterminada con algunas de las cargas de trabajo de .NET.

  • Instalación de WSL.

  • Instalación de la distribución que prefiera.

Inicio de la depuración con WSL

  1. Después de instalar los componentes necesarios, abra una aplicación web de ASP.NET Core o una aplicación de consola de .NET Core en Visual Studio y verá un nuevo perfil de inicio denominado WSL:

    Perfil de inicio de WSL en la lista de perfiles de inicio

  2. Seleccione este perfil para agregarlo a su archivo launchSettings.json.

    En el ejemplo siguiente se muestran algunos de los atributos clave del archivo.

    Nota

    A partir de Visual Studio 2022 Preview 3, el nombre del comando en el perfil de inicio cambió de WSL2 a WSL.

    "WSL": {
        "commandName": "WSL",
        "launchBrowser": true,
        "launchUrl": "https://localhost:5001",
        "environmentVariables": {
            "ASPNETCORE_URLS": "https://localhost:5001;http://localhost:5000",
            "ASPNETCORE_ENVIRONMENT": "Development"
        },
        "distributionName": ""
    }
    
    "WSL": {
        "commandName": "WSL2",
        "launchBrowser": true,
        "launchUrl": "https://localhost:5001",
        "environmentVariables": {
            "ASPNETCORE_URLS": "https://localhost:5001;http://localhost:5000",
            "ASPNETCORE_ENVIRONMENT": "Development"
        },
        "distributionName": ""
    }
    

    Una vez que haya seleccionado el nuevo perfil, la extensión comprobará que la distribución de WSL está configurada para ejecutar aplicaciones .NET y le ayudará a instalar las dependencias que falten. Después de instalar estas dependencias, ya podrá depurar en WSL.

  3. Inicie la depuración de la forma habitual; la aplicación se ejecutará en la distribución predeterminada de WSL.

    Una manera sencilla de asegurarse de que la aplicación se está ejecutando en Linux es comprobar el valor de Environment.OSVersion.

Nota

Solo se han probado y solo se admiten Ubuntu y Debian. Otras distribuciones admitidas por .NET deberían funcionar, pero se necesita la instalación manual del runtime de .NET y de Curl.

Elección de una distribución específica

De forma predeterminada, el perfil de inicio de WSL 2 usa la distribución predeterminada establecida en wsl.exe. Si quiere que el perfil de inicio tenga como destino una distribución específica, independientemente de la distribución predeterminada, puede modificar el perfil de inicio. Por ejemplo, si está depurando una aplicación web y quiere probarla en Ubuntu 20.04, el perfil de inicio tendrá el siguiente aspecto:

"WSL": {
    "commandName": "WSL",
    "launchBrowser": true,
    "launchUrl": "https://localhost:5001",
    "environmentVariables": {
        "ASPNETCORE_URLS": "https://localhost:5001;http://localhost:5000",
        "ASPNETCORE_ENVIRONMENT": "Development"
    },
    "distributionName": "Ubuntu-20.04"
}
"WSL": {
    "commandName": "WSL2",
    "launchBrowser": true,
    "launchUrl": "https://localhost:5001",
    "environmentVariables": {
        "ASPNETCORE_URLS": "https://localhost:5001;http://localhost:5000",
        "ASPNETCORE_ENVIRONMENT": "Development"
    },
    "distributionName": "Ubuntu-20.04"
}

Varias distribuciones como destino

Para ir un paso más allá, si está trabajando en una aplicación que debe ejecutarse en varias distribuciones y quiere probarla en cada una de ellas de forma rápida, puede tener varios perfiles de inicio. Por ejemplo, si necesita probar su aplicación de consola en Debian, Ubuntu 18.04 y Ubuntu 20.04, puede usar los siguientes perfiles de Inicio:

"WSL : Debian": {
    "commandName": "WSL",
    "distributionName": "Debian"
},
"WSL : Ubuntu 18.04": {
    "commandName": "WSL",
    "distributionName": "Ubuntu-18.04"
},
"WSL : Ubuntu 20.04": {
    "commandName": "WSL",
    "distributionName": "Ubuntu-20.04"
}
"WSL : Debian": {
    "commandName": "WSL2",
    "distributionName": "Debian"
},
"WSL : Ubuntu 18.04": {
    "commandName": "WSL2",
    "distributionName": "Ubuntu-18.04"
},
"WSL : Ubuntu 20.04": {
    "commandName": "WSL2",
    "distributionName": "Ubuntu-20.04"
}

Con estos perfiles de inicio, puede cambiar fácilmente de una distribución de destino a otra desde la comodidad de Visual Studio.

Varios perfiles de inicio de WSL en la lista de perfiles de inicio

Asociación a un proceso WSL en ejecución

Además de depurar desde el inicio de la aplicación mediante F5, puede depurar mediante la asociación a un proceso de WSL en ejecución mediante la característica adjuntar al proceso.

  1. Con la aplicación en ejecución, seleccione Depurar>Asociar al proceso.

  2. En Tipo de conexión, elija Subsistema de Windows para Linux (WSL) y, a continuación, elija la distribución de Linux para el destino de conexión.

  3. Elija Asociar.

    Captura de pantalla del proceso WSL en el cuadro de diálogo Asociar al proceso

Configuración de WSL en el perfil de inicio

En la tabla siguiente se muestran los parámetros de configuración que se admite en el perfil de inicio.

Nombre Valor predeterminado Propósito ¿Admite tokens?
executablePath dotnet El archivo ejecutable que se va a ejecutar.
commandLineArgs Valor de la propiedad de MSBuild TargetPath asignada al entorno de WSL Los argumentos de la línea de comandos que se pasan a executablePath.
workingDirectory Para aplicaciones de consola: {OutDir}
para aplicaciones web: {ProjectDir}
El directorio de trabajo en el que se va a iniciar la depuración.
environmentVariables Los pares clave-valor de variables de entorno que se van a establecer para el proceso depurado.
setupScriptPath El script que se va a ejecutar antes de la depuración. Resulta útil para ejecutar scripts como ~/.bash_profile.
distributionName El nombre de la distribución de WSL que se va a usar. No
launchBrowser false Indica si se va a iniciar o no un explorador. No
launchUrl La dirección URL que se iniciará si el valor de launchBrowser es true. No

Tokens admitidos:

{ProjectDir}: ruta de acceso al directorio del proyecto

{OutDir}: valor de la propiedad de MSBuild OutDir

Nota

Todas las rutas de acceso son para WSL, no para Windows.

Paso de un argumento de la línea de comandos

Use la configuración commandLineArgs para pasar un argumento de línea de comandos a WSL en el perfil de inicio.

En el ejemplo siguiente, se pasan dos argumentos a un proyecto DLL denominado ConsoleApp.

"WSL": {
  "commandName": "WSL",
  "commandLineArgs": "\"{OutDir}/ConsoleApp.dll\" arg1 arg2"
}