Visual Studio を使用して WSL で .NET アプリをデバッグする

WSL を使用して Visual Studio を離れることなく、Linux で .NET Core および .NET 5 以降のアプリを簡単に実行およびデバッグできます。 クロスプラットフォームの開発者は、より多くのターゲット環境をテストする簡単な方法として、この方法を使用できます。

Linux をターゲットとする Windows .NET ユーザーの場合、WSL は、運用環境の現実主義と生産性の間のスイート スポットに存在します。 Visual Studio では、リモート デバッガーを使用するか、コンテナーでコンテナー ツールを使用して、リモート Linux 環境で既にデバッグを行うことができます。 運用環境の現実主義が主な関心事である場合は、これらのオプションのいずれかを使用する必要があります。 簡単で高速な内部ループがより重要である場合は、WSL が最適なオプションです。

方法を 1 つに絞り込む必要はありません。 同じプロジェクトで Docker と WSL の起動プロファイルを使用し、どちらか特定の実行に適した方を選択することができます。 アプリをデプロイした後は、問題が発生した場合はいつでも、リモート デバッガーを使用してアタッチできます。

Note

Visual Studio 2019 バージョン 16.11 Preview 3 以降、WSL 2 デバッグ ターゲットの名前が WSL に変更されました。

前提条件

  • .NET デバッグと WSL オプション コンポーネントが含まれる Visual Studio 2019 v16.9 Preview 1 以降のバージョン。

    WSL コンポーネントを確認するには、[ツール][ツールと機能を取得] の順に選択します。 Visual Studio インストーラーで、[個々のコンポーネント] タブを選択し、検索語として「WSL」と入力し、コンポーネントが確実にインストールされるようにします。

    一部のバージョンの Visual Studio では、オプション コンポーネントが一部の .NET ワークロードと共に既定で含まれています。

  • WSL をインストールします。

  • 任意のディストリビューションをインストールします。

WSL を使用してデバッグを開始する

  1. 必須コンポーネントをインストールした後、Visual Studio で ASP.NET Core Web アプリまたは .NET Core コンソール アプリを開きます。WSL という名前の新しい起動プロファイルが表示されます。

    起動プロファイル一覧の WSL 起動プロファイル

  2. このプロファイルを選択して、launchSettings.json に追加します。

    次の例には、ファイルのいくつかの重要な属性が示されています。

    Note

    Visual Studio 2022 Preview 3 以降、起動プロファイルのコマンド名が WSL2 から 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": ""
    }
    

    新しいプロファイルを選択すると、拡張機能により、WSL のディストリビューションが .NET アプリを実行するように構成されていることが確認され、不足している依存関係をインストールするのに役立ちます。 これらの依存関係をインストールすると、WSL でデバッグできるようになります。

  3. 通常どおりデバッグを開始すると、アプリは既定の WSL ディストリビューションで実行されます。

    Linux で実行されていることを確認する簡単な方法は、Environment.OSVersion の値を確認することです。

Note

Ubuntu と Debian だけがテストされており、サポートされています。 .NET でサポートされている他のディストリビューションも機能するはずですが、.NET ランタイムCurl を手動でインストールする必要があります。

特定のディストリビューションを選択する

既定の WSL 2 起動プロファイルでは、wsl.exe で設定されている既定のディストリビューションが使用されます。 起動プロファイルのターゲットを特定のディストリビューションにする場合は、その既定値に関係なく、起動プロファイルを変更できます。 たとえば、Web アプリをデバッグしていて、それを Ubuntu 20.04 でテストしたい場合、起動プロファイルは次のようになります。

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

複数のディストリビューションをターゲットにする

さらに一歩進んで、複数のディストリビューションで実行する必要があるアプリケーションの作業を行っていて、それぞれで簡単にテストする手段が必要な場合は、複数の起動プロファイルを使用できます。 たとえば、Debian、Ubuntu 18.04、Ubuntu 20.04 でコンソール アプリをテストする必要がある場合は、次の起動プロファイルを使用できます。

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

これらの起動プロファイルを使用すると、快適な Visual Studio から離れなくても、ターゲット ディストリビューション間を簡単に切り替えることができます。

起動プロファイル一覧の複数の WSL 起動プロファイル

実行中の WSL プロセスにアタッチする

F5 を使ってアプリの起動からデバッグする以外に、attach to process 機能を使って、実行中の WSL プロセスにアタッチすることでデバッグできます。

  1. アプリが実行されている状態で、[デバッグ]>[プロセスにアタッチ] を選びます。

  2. [接続の種類] として、[Linux 用 Windows サブシステム (WSL)] を選び、[接続ターゲット] の Linux ディストリビューションを選びます。

  3. [アタッチ] をクリックします。

    [プロセスにアタッチ] ダイアログ ボックスの WSL プロセスのスクリーンショット。

    [プロセスにアタッチ] ダイアログ ボックスの WSL プロセスのスクリーンショット。

起動プロファイルでの WSL の設定

次の表は、起動プロファイルでサポートされている設定を示したものです。

名前 Default 目的 トークンがサポートされているか?
executablePath dotnet 実行する実行可能ファイル はい
commandLineArgs WSL 環境にマップされている MSBuild のプロパティ TargetPath の値 executablePath に渡されるコマンド ライン引数 はい
workingDirectory コンソール アプリの場合: {OutDir}
Web アプリの場合: {ProjectDir}
デバッグを開始する作業ディレクトリ はい
environmentVariables デバッグ対象のプロセスに設定する環境変数のキーと値のペア。 はい
setupScriptPath デバッグの前に実行するスクリプト。 ~/.bash_profile のようなスクリプトを実行する場合に便利です。 はい
distributionName 使用する WSL ディストリビューションの名前。 いいえ
launchBrowser false ブラウザーを起動するかどうか いいえ
launchUrl launchBrowser が true の場合に起動する URL いいえ

サポートされているトークン:

{ProjectDir} - プロジェクト ディレクトリへのパス

{OutDir} - MSBuild のプロパティ OutDir の値

Note

すべてのパスは Windows ではなく WSL 用です。

コマンド ライン引数を渡す

commandLineArgs の設定を使用して、コマンド ライン引数を起動プロファイルの WSL に渡します。

次の例では、ConsoleApp という名前の DLL プロジェクトに 2 つの引数を渡します。

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