VSCodeで.NET Frameworkコンソールアプリをビルド＆デバッグする

[Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)で、.NET Coreのビルド＆デバッグはできるっぽいのですが、.NET Frameworkの方法が見つからなかったのでまとめてみました。

参考にしたのは、ここです。
[Visual Studio Code for .Net Framework - Stack Overflow](https://stackoverflow.com/questions/47707095/visual-studio-code-for-net-framework)

## Explorerから*.slnプロジェクトファイルのあるフォルダーを選択
![プロジェクトファイルのあるフォルダーを開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/a2328a13-ed49-56db-f25f-f787abc7a17b.png "プロジェクトファイルのあるフォルダーを開く")

左上のアイコン「Explorer」をクリックして、「Add Folder」を選択して、.NET Frameworkコンソールアプリケーションのプロジェクトファイル（*.slnなど）があるフォルダーを選択して「Add」しましょう。

まだ、C#プログラミングのプラグインをVSCodeに入れていないようなら、自動的に「OmniSharp」などのプラグインが勝手にダウンロード＆インストールされるかもしれませんが、その辺は今回、割愛。

## ビルドタスク実行（とりあえずtasks.jsonの生成）

ショートカットキー「Ctrl+Shift+B」を押して、ビルドタスクの実行を行います。すると、まだビルド設定がないため、ウィンドウ上部に「tasks.json」を新たに作るようにメニューが現れます。
![新しいtasks.jsonファイルを作る](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/f8db5d31-0990-9795-17d9-640b1ee75827.png "新しいtasks.jsonファイルを作る")

新しい「tasks.json」を作ることを選択すると、下の画像のように何種類かのビルド設定が表示されますので、
![MSBuildを選択する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/c8a94e0b-4bc7-dfc0-c5e1-fb16e0b2d9f8.png "MSBuildを選択する")

「MSBuild」を選択しましょう。
![デフォルトのtasks.jsonが作成される](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/6f28625e-76be-aad1-ccfd-7da5bff299c5.png "デフォルトのtasks.jsonが作成される")

すると、デフォルトの「tasks.json」ファイルが、*.slnなどのプロジェクトファイルのあるフォルダーに、「.vscode」というフォルダーを作成し、その中に「tasks.json」ファイルが作成されます。
![tasks.jsonファイルは.vscodeフォルダーに作成される](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/8357ad58-a32c-014e-37cc-b6f10e7723d5.png "tasks.jsonファイルは.vscodeフォルダーに作成される")
![tasks.jsonファイルが作成される](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/10febd0d-8d2a-2940-8b42-08a3f3dee7c2.png "tasks.jsonファイルが作成される")

デフォルトでは、以下の内容の「tasks.json」ファイルが生成されます。

```json:tasks.json
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build",
      "type": "shell",
      "command": "msbuild",
      "args": [
        // Ask msbuild to generate full paths for file names.
        "/property:GenerateFullPaths=true",
        "/t:build",
        // Do not generate summary otherwise it leads to duplicate errors in Problems panel
        "/consoleloggerparameters:NoSummary"
      ],
      "group": "build",
      "presentation": {
        // Reveal the output only if unrecognized errors occur.
        "reveal": "silent"
      },
      // Use the standard MS compiler pattern to detect errors, warnings and infos
      "problemMatcher": "$msCompile"
    }
  ]
}
```
## tasks.jsonの書き換え

もちろん、このままでは使えないので全面的に書き換えます。

なお、tasks.jsonの設定については、以下のページが参考になります。
[https://code.visualstudio.com/docs/editor/tasks](https://code.visualstudio.com/docs/editor/tasks)

```json:tasks.json
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      //【重要】タスク名を記載する（後述のlaunch.jsonと連動します）
      "label": "debug msbuild",
      // プログラムの種類
      "type": "shell",
      // ビルドツール（MSBuild.exe）の位置。以下の例ではv.4.0を使うのでその実行ファイルパスを指定します。
      "command": "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\MSBuild.exe",
      // MSBuild.exeへの引数を指定します。
      "args": [ 
        // プロジェクトファイル（*.slnなど）のあるパスを指定します。
        "C:\\Users\\hibara\\Desktop\\ConsoleApp1\\ConsoleApp1.sln",
        // ターゲット（/target）をビルドする
        "/t:build",
        // プロジェクトのビルドに使用するツールセットのバージョン
        "/p:toolsVersion=4.0",
        // デバッグビルド
        "/p:Configuration=Debug",
        // プラットフォームは「Any CPU（32bit, 64bit）」
        "/p:Platform=\"Any CPU\""
      ],
      // タスクのグループを設定します。この場合は一つだけなので適当の「build」としました。
      "group": "build",
      // タスクの出力がユーザーインターフェースでどのように処理されるかを定義します。
      "presentation": {
        // 出力を表示する統合ターミナルが常に表示され、タスクの実行ごとに新しいターミナルが作成されます。
        "reveal": "always",
        // 実行後にターミナルウィンドウにフォーカスを移します（
        "focus": true,
      },
      // ビルドにエラーが発生した場合に、その出力から問題点を検出する際に使用する「プロブレムマッチャー」を指定する。
      // ここではC#のコードなので、"$msCompile"が指定されています。
      "problemMatcher": "$msCompile"
    }
  ]
}
```
MSBuild.exeの引数については以下のURLを参考にしてください。
[https://docs.microsoft.com/ja-jp/visualstudio/msbuild/msbuild-command-line-reference?view=vs-2019](https://docs.microsoft.com/ja-jp/visualstudio/msbuild/msbuild-command-line-reference?view=vs-2019)

## 実行・デバッグ設定（とりあえずlaunch.jsonの生成）

次に、「launch.json」を用意します。このファイルを作成するときは、VSCodeの左側にある「run」アイコンをクリックします。
![runアイコンをクリックする](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/c3e67691-0fa8-4414-1ced-2c45eb672b32.png "runアイコンをクリックする")

クリックすると、VSCodeウィンドウ上部に「Select environment（環境設定選択）」が出てきますが、.NET Frameworkの選択項目はありませんので、とりあえず「.NET Core」を選択します。
![.NET Coreの環境設定を選択する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/52f156ce-89f6-a9f7-e301-eca3eb6083c9.png ".NET Coreの環境設定を選択する")

すると、自動的に以下のような「launch.json」ファイルが生成されます。中身は、.NET Coreのものなので、このままでは使えません。
![launch.json」ファイルが作られる](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/a97fde1f-b229-2a00-722d-2b0ce0a4858c.png "launch.json」ファイルが作られる")

「launch.json」ファイルは、先ほど作成した「tasks.json」と同じ場所に生成されます。プロジェクトファイルがあるフォルダー、「.vscode」フォルダーの中です。
![「.vscode」フォルダの中に「launch.json」が生成される](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/a61d39c8-b228-f38b-52cf-731ba9018de3.png "「.vscode」フォルダの中に「launch.json」が生成される")

## launch.jsonの書き換え

「launch.json」ファイルの中身は、以下のように大きく書き換えます。

```json:launch.json
{
  // 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
  "version": "0.2.0",
  "configurations": [
    {
      // デバッグ時のウィンドウから実行を選択する際のメニュー項目名になります。
      "name": ".NET Launch (console)",
      // プログラムの種類は「Desktop CLR debugger」を指定します。
      "type": "clr",
      // 起動設定のリクエストの種類です。ここでは単純に「launch」です。
      "request": "launch",
      // 起動前のタスクを指定します。「tasks.json」内「label」で指定した名前を記載します。
      "preLaunchTask": "debug msbuild",
      // 起動する（ビルドされた）実行ファイルパスを指定します。
      "program": "C:\\Users\\hibara\\Desktop\\ConsoleApp1\\ConsoleApp1\\bin\\Debug\\ConsoleApp1.exe",
      // 上記の実行ファイルに付加する引数を以下に記載します。
      "args": [],
      // 作業ファイルのあるディレクトリーパスを指定します。この例では実行ファイルのある場所です。
      "cwd": "C:\\Users\\hibara\\Desktop\\ConsoleApp1\\ConsoleApp1\\bin\\Debug\\",
      // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window
      // 上記URLにあるとおり、コンソールは、VSCode内のコンソールに表示されるように指定します。
      "console": "internalConsole",
      // デバッグ中にデバッグコンソール表示をどうするかを指定します。ここではスタートと同時に表示としています。
      "internalConsoleOptions": "openOnSessionStart"
    },
  ]
}
```
特に「preLaunchTask」は重要です。先ほど「tasks.json」内で記載した「label」と、同じ値を記載する必要があります。この例ですと、「"debug msbuild"」が、それです。

なお、「launch.json」ファイルについての詳細は以下のURLを参照してください。
[https://code.visualstudio.com/docs/editor/debugging](https://code.visualstudio.com/docs/editor/debugging)

## プログラムの実行、デバッグ

これで準備が整ったので、再びVSCodeの左側にある「run」アイコンをクリックして、ウィンドウ上部に出てくるメニューから「.NET launch(console) (ConsoleApp1)」を選択、三角のアイコンを押して実行します。
![コンソールアプリを選択・実行](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/2be9d90b-3b86-4716-6fce-5c3d40bc67f0.png "コンソールアプリを選択・実行")

ビルドされた後に、実行された結果は以下にあるようにVSCodeのコンソールウィンドウに表示されます。
![プログラム実行結果の表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30945/4bd6450e-2dc9-0cc8-ec7e-bb62c3d9b57e.png "プログラム実行結果の表示")

なお、プログラムの停止は、ツールバーにある四角アイコンの停止ボタンをクリックしてください。