Visual Studio を使用して WSL で .NET アプリをデバッグする
Linux 用 Windows サブシステム (WSL) を使用して Visual Studio を離れることなく、Linux で .NET Core アプリと .NET 5 以降のアプリを簡単に実行およびデバッグできます。 クロスプラットフォームの開発者は、より多くのターゲット環境をテストする簡単な方法として、この方法を使用できます。
Linux をターゲットとする Windows .NET ユーザーの場合、WSL は、運用環境の現実主義と生産性の間のスイート スポットに存在します。 Visual Studio では、リモート デバッガーを使用するか、コンテナーでコンテナー ツールを使用して、リモート Linux 環境で既にデバッグを行うことができます。 運用環境の現実主義が主な関心事である場合は、これらのオプションのいずれかを使用する必要があります。 簡単で高速な内部ループがより重要である場合は、WSL が最適なオプションです。
方法を 1 つに絞り込む必要はありません。 同じプロジェクトで Docker と WSL の起動プロファイルを使用し、どちらか特定の実行に適した方を選択することができます。 アプリをデプロイした後は、問題が発生した場合はいつでも、リモート デバッガーを使用してアタッチできます。 WSL で実行されている Linux Docker コンテナーをデバッグするには、「 Docker コンテナーで実行されているプロセスへのアタッチを参照してください。
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 を使用してデバッグを開始する
必須コンポーネントをインストールした後、Visual Studio で ASP.NET Core Web アプリまたは .NET Core コンソール アプリを開きます。WSL という名前の新しい起動プロファイルが表示されます。
このプロファイルを選択して、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 でデバッグできるようになります。
通常どおりデバッグを開始すると、アプリは既定の 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 プロセスにアタッチする
F5 を使ってアプリの起動からデバッグする以外に、attach to process 機能を使って、実行中の WSL プロセスにアタッチすることでデバッグできます。
アプリが実行されている状態で、[デバッグ]>[プロセスにアタッチ] を選びます。
[接続の種類] として、[Linux 用 Windows サブシステム (WSL)] を選び、[接続ターゲット] の Linux ディストリビューションを選びます。
[アタッチ] をクリックします。
起動プロファイルでの 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"
}