[C#]VSCodeで複数プロジェクトを持つソリューションを作るときの備忘録

# はじめに
普段C#を書くときはVisualStudio（IDEのほう）を利用しているのだけれども、VSCodeを利用したときに複数プロジェクトを作成するときに個人的に嵌った部分があったのでその備忘録。 
具体的にはデバッグするときにどのプロジェクトをデバッグするのか選ぶ方法がわからなかった。
結論から言うとたぶんlaunchi.jsonとtasks.jsonを編集すれば良いのだけれど、VSCodeに全然詳しくないのでよくわからない。

# 環境
OS：Windows10

VSCode(V1.66.0)
VSCodeのC#拡張(v1.24.3)
.NetSDK（.net6)

# やり方
## ソリューションとプロジェクトの作成
VisualStudioなら新しいプロジェクトの作成のテンプレートを選ぶだけでソリューションとプロジェクトを作成してくれるけど、VSCode＋.NetSDKではそれぞれ別に作成する必要がある。（たぶん。他の拡張を入れればもっと簡単になるのかもしれない）

まずはソリューションを作成する。ソリューションを作成したいフォルダをVSCodeで開き、ターミナルから以下のコマンドを実行する。
```powershell
dotnet new sln
```
これでフォルダ名と同じslnファイルができたはず。
![スクリーンショット 2022-04-07 193744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/8283e0ca-c8b7-b421-8168-22174623e424.png)

続いてプロジェクトを追加する（今回はコンソール二つ）。ターミナルから以下のコマンドを実行する。
```powershell
dotnet new console -o ConsoleApp1
dotnet new console -o ConsoleApp2
```
このコマンドでそれぞれのフォルダが作成され、その中にプロジェクトが作成されたはず。
![スクリーンショット 2022-04-07 194448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/e6b1e370-164b-9319-97d5-ce9d30c85df7.png)

ただ、この状態だとソリューションにプロジェクトが追加されていない。以下のコマンドでプロジェクトを追加する。
```powershell
dotnet sln add .\ConsoleApp1\
dotnet sln add .\ConsoleApp2\
```
（作成とソリューションへの追加を同時にやってくれるVisualStudioIDEは賢い）


## ビルドとデバッグの構成ファイルの作成
続いてVSCodeでビルドとデバッグを行うための構成ファイルみたいなものを作成する。
プロジェクトを作成してしばらくすると、右下にポップアップがでて構成ファイルの作成を提案してくれる。
![スクリーンショット 2022-04-07 195846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/3daac738-9204-de32-dc8b-2f84528f8a1a.png)
これにYesと押せばとりあえずビルドとデバッグの設定をしてくれる。
もしもこのポップアップを見逃してしまってもコマンドパレットから呼び出す方法がある。

一つの方法はC#の拡張機能のリスタートを呼び出す方法がある。Shift+Ctrl+Pを押してコマンドパレットを呼び出して「OmniSharp: Restart OmniSharp」を検索して実行する。しばらくするともう一度ポップアップが表示されるはず。
![スクリーンショット RestartOmin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/7932c8ad-ab48-ae2c-f7ad-88f3e7cc5777.png)
二つ目の方法は、直接構成ファイルの作成機能を呼び出すことができる。
Shift+Ctrl+Pを押してコマンドパレットを呼び出して「.Net: Generate Assets for Build and Debug」を検索して実行する。
![スクリーンショット 2022-04-07 200412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/c3a7e2aa-9188-52fb-487f-d83c85341dd6.png)
とりあえずどちらかのプロジェクトを選択する。（今回はConsoleApp1）
![スクリーンショット 2022-04-07 201315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/94d1a363-f276-9778-4c2d-69415a73ec2d.png)
この方法の場合は偶にC#の拡張がプロジェクトを認識できていなくて以下のようなポップアップがでて失敗することがある。csファイルをいじったり、コマンドパレットから「OmniSharp: Select Project」を呼び出したりするとなぜか直ったりする。よくわからない。ダメなときは何度か再起動する。（よくわからない）
![スクリーンショット 2022-04-07 200753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/d3aff9ab-07ea-819f-bfd4-1e3b0dda5507.png)

とりあえずこれでビルドとデバッグの構成ファイルができた。具体的には.vscodeというフォルダが作成され、その中にlaunchi.jsonとtasks.jsonが作成された。ただしこれでは複数のプロジェクトの切り替えができない。
![スクリーンショット 2022-04-07 210726.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/933e6a47-8648-b9ab-3767-51932b826b66.png)

## 構成ファイルの編集

複数のプロジェクトをビルドとデバッグを切り替えられるようにこの二つのjsonを編集する。

まず、tasks.jsonを編集する。
"label": "build" を"label": "build_ConsoleApp1"などに書き換える。（名前は何でもよい）
```json
省略
   "tasks": [
        {
            "label": "build_ConsoleApp1",//ココの名前を変える
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}/ConsoleApp1/ConsoleApp1.csproj",
                "/property:GenerateFullPaths=true",
                "/consoleloggerparameters:NoSummary"
            ],
            "problemMatcher": "$msCompile"
        },
省略
```
続いてlaunch.jsonを編集する。
以下の２か所を変更する
"name": ".NET Core Launch (console)", を"name": ".NET Core Launch (console)_ConsoleApp1"などに変える（名前は何でもよい）
"preLaunchTask": "build",を"preLaunchTask": "build_ConsoleApp1",に変える（先ほどtasks.jsonで変更した名前にする）
```json-doc
省略
    "configurations": [
        {
            // Use IntelliSense to find out which attributes exist for C# debugging
            // Use hover for the description of the existing attributes
            // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
            "name": ".NET Core Launch (console)_ConsoleApp1",//ココを変える
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build_ConsoleApp1",//ココを変える（tasks.jsonのビルドの設定と同じ）
            // If you have changed target frameworks, make sure to update the program path.
            "program": "${workspaceFolder}/ConsoleApp1/bin/Debug/net6.0/ConsoleApp1.dll",
            "args": [],
            "cwd": "${workspaceFolder}/ConsoleApp1",
            // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
            "console": "internalConsole",
            "stopAtEntry": false
        },
省略
```

次にもう片方のプロジェクト（ConsoleApp2）の設定を行う。ビルドとデバッグの構成ファイルの作成の二つ目の方法と同様にコマンドパレットとから構成ファイルの作成機能を呼び出す。
Shift+Ctrl+Pを押してコマンドパレットを呼び出して「.Net: Generate Assets for Build and Debug」を検索して実行する。
![スクリーンショット 2022-04-07 200412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/c3a7e2aa-9188-52fb-487f-d83c85341dd6.png)

今回は以下のような警告がでるが、Replaceされるのはtasks.jsonの"label"やlaunch.jsonの"name"を書き換えなかった項目だけなのでYesを選択する。
（ほかの項目が書き換えられたくないならほかの項目も書き換えておく。この記事ではビルドとデバッグに絞って説明する）
![スクリーンショット 2022-04-07 213500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/54409718-a7e0-9e89-da81-dcca3739be78.png)
作成したいプロジェクトを選択する。（今回はConsoleApp2）
![スクリーンショット 2022-04-07 213705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/1c8e8b06-569a-0559-ba3e-759adfd6711f.png)

tasks.jsonにまた"label": "build"が追記されたはずなので同様に書き換える。
```json
省略
        {
            "label": "build_ConsoleApp2",//ココを書き換える
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}/ConsoleApp2/ConsoleApp2.csproj",
                "/property:GenerateFullPaths=true",
                "/consoleloggerparameters:NoSummary"
            ],
            "problemMatcher": "$msCompile"
        }
省略
```
lauch.jsonにも"name": ".NET Core Launch (console)"が追加されたので同様に書き換える
```json-doc
省略
        {
            // Use IntelliSense to find out which attributes exist for C# debugging
            // Use hover for the description of the existing attributes
            // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
            "name": ".NET Core Launch (console)_ConsoleApp2",//ココを変える
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build_ConsoleApp2",//ココを変える（tasks.jsonのビルドの設定と同じ）
            // If you have changed target frameworks, make sure to update the program path.
            "program": "${workspaceFolder}/ConsoleApp2/bin/Debug/net6.0/ConsoleApp2.dll",
            "args": [],
            "cwd": "${workspaceFolder}/ConsoleApp2",
            // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
            "console": "internalConsole",
            "stopAtEntry": false
        }
省略
```

## デバッグを切り替える
VSCodeの実行とデバッグから切り替えられる。
![スクリーンショット 2022-04-07 215149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/37000017-ed25-a699-513e-86da4b1efbf0.png)

## おまけ：ソリューションをビルドするタスクを追加する。
VisualStudioみたいにShift+Ctrl+Bでビルドを行いたいのでその設定をする。
tasks.jsonを編集する。既にあるビルドタスクをコピペして、ソリューションビルドのタスクを設定する。
```json-doc
        {
            "label": "build_Sln",//ソリューションビルド用のタスクの名前
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}/MySln.sln",//ソリューションをビルドできるようにパスを設定する
                "/property:GenerateFullPaths=true",
                "/consoleloggerparameters:NoSummary"
            ],
            "problemMatcher": "$msCompile"
        }
```
コマンドパレットから「Tasks: Configure Default Build Task」で規定のビルドタスクを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/6096aa4f-331d-fbce-09a0-880179fe33ca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215751/350f5065-072b-3d79-ce70-e2106131002c.png)

ショートカットを弄っていなければShift+Ctrl+Bでビルドできるようになったはず。

# 終わりに
さすがにVisualStudioIDEに比べるとめんどくさい。なれればすぐに出来そうだけど。良い拡張とかあるのかな？
他の嵌りポイントとしてビルドやデバッグでエラーや警告があったときに、エディタで修正してもなぜかもう一度ビルドするまで残ってしまう事象に悩まされたけど、それはtasks.jsonのビルドタスクの"problemMatcher": "$msCompile"を消せば解決するみたい。（また別記事にするかも）