【VB.NET】拡張コンパイラModVBの紹介(インストール編)

# はじめに
これは、[Visual Basic Advent Calendar 2022](https://qiita.com/advent-calendar/2022/vb)の22日目の記事となります。

# ModVBとは
ModVB とは、新しい機能を利用するために VSIX と対応する NuGet パッケージをインストールする無料のスタンドアロン VB.NET "mod" です。

mod の意味には、修正版 (modified)、modern (modern)、modulo operation (modulo) が含まれます。
(VB + ModVB) Mod VB = ModVB

## ModVBの作者について
Anthony D. Green は、Microsoft のマネージ プログラミング言語チームで 8 年の経験があります。主に Roslyn コンパイラ チームのプログラムマネージャーです。13歳で VB4 でプログラミングを始め、ModVB の最初のパブリック ベータ版がリリースされたときは 37 歳でした。

「Microsoft時代には何人もの日本人VB MVPに会いましたが、少なくとも一人はいつも和菓子を持ってきていました。」と述べています。

### VB.NETとC#の違いを徹底解説
>「VB.NETとC#の違いを徹底的に解説」を書いたとき、私は文字通り5、6週間連続で自分のアパートに引きこもり、食べることと書くことしかしませんでした。

https://anthonydgreen.net/2019/02/12/exhausting-list-of-differences-between-vb-net-c/

# インストール方法
## 環境
* Windows 11 x64 Home
* Visual Studio 2022 Community

## ModVB用スタンドアロン環境を作成
この手順は、プラグインを個別に管理できるように、ModVB がインストールされている環境とインストールされていない環境を分離するために使用されます。
※環境を特に気にしない方は飛ばして構いません。

1. Visual Studio 2022のメニューから[ツール] → [コマンド ライン] → [開発者コマンドプロンプト]を起動します。
2. コマンドプロンプトの実行 `devenv /rootSuffix ModVB`

ModVB用のショートカットを作成しておくといいでしょう。

```text
"C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\devenv.exe" /rootSuffix ModVB
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/dfef10ab-c9db-417e-4f94-49d1f74d6859.png)

## VSIXソースを追加
メニューからツール→オプションを開き、拡張機能の「ModVB」を見つけます。

* 名前：ModVB
* リンク： https://www.myget.org/F/modvb/vsix/

「Apply」ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/8812fccb-d18c-d764-eea5-55b7f33e065b.png)

## NuGetソースを追加
続けてオプションダイアログの[NuGet パッケージマネージャー] → [パッケージ ソース]を見つけます。

右側に新しいパッケージ ソースを追加し、それがチェックされていることを確認します

* 名前：ModVB
* ソース： https://www.myget.org/F/modvb/api/v3/index.json

[更新] → [OK] の順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/55cff0f8-d115-782a-7bb3-27e56222a8fb.png)

## ModVB 言語サービス拡張機能の追加
1. メニューから[拡張機能]→[拡張機能の管理]を選択します。
2. 左側のオンライン→[ModVB]を選択します。
3. 「ModVB Language Service (Built with Roslyn)」をダウンロードしてインストールします。
4. Visual Studio を再起動して、拡張機能のインストールを完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/eb600036-2de1-4909-18a2-8de62a0ab981.png)

# ModVBの機能予定
現時点(2022/12/22)では、Wave 1は今年の夏にリリースされました。WAVE 2が12月予定とのことでしたが、まだ未リリースです。

|バージョン|機能内容|
| ---- | ---- |
|Wave 1|JSON リテラルとパターン マッチングを中心に展開|
|Wave 2|XML リテラルの強化|
|Wave 3|不明 Wave 2 と Wave 4の中間の機能強化|
|Wave 4|Async ストーリー強化|
|Wave 5|LINQ のより深い統合|

https://anthonydgreen.net/2022/08/20/modvb-wave-1-json-literals-and-pattern-matching/

# ModVBの使い方
## ModVB コンパイラを有効にする
1. 新しい VB プロジェクトを作成します。例 .NET 7.0 コンソールアプリケーション
2. プロジェクト参照を右クリックし、[NuGet パッケージの管理] を選択します。
3. 右上のドロップダウン ボックスで、ModVB をパッケージ ソースとして選択します。
4. 「プレリリースを含める」にチェックを入れます。
5. 「ModVB.Compilers.Toolset」をインストールします。このパッケージは ModVB コンパイラです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/9a8acdbc-d80d-1776-ff1f-62482650a598.png)

# JSON 定数とパターンマッチング
JSON 変数のタイプを選択します。
対応する NuGet パッケージをインストールする。
JSON 関連の構文を使用する前に、まず JSON 定数に使用するライブラリを選択する必要があります。現在利用できるのは`Newtonsoft.Json`と `System.Text.Json`です。

* Newtonsoft.Json を選択した場合は、インストールする必要があります。
* System.Text.Json を選択した場合は、インストールする必要があります。

デフォルトでは、JSON 定数とパターン マッチングは、`Newtonsoft.Json`で定義された型を使用します。それ以外のライブラリを選択した場合は、コンパイル定数を定義してデフォルトの型を変更する必要があります。

「ModVB.Compilers.Toolset」をインストールと同じ手順で「Newtonsoft.Json」をインストールします。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/681dfa49-8a1b-698e-b29c-c36ffd11e1ad.png)

## 自動的に推測される JSON 型を指定します
プロジェクトがあると仮定すると、上記の両方のライブラリがインストールされます。
デフォルトでは、Jsonオブジェクトは`Newtonsoft.Json.Linq.JObject`です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/baabb68b-b166-931e-da7c-c44d76322bbe.png)

デフォルトで`System.Text.Json`を使用する場合は、プロジェクト ファイルにコンパイル定数を定義する必要があります。

```xml
<PropertyGroup>
  <DefineConstants>DEFAULT_JSON_OBJECT_TYPE = "System.Text.Json.Nodes.JsonObject",DEFAULT_JSON_ARRAY_TYPE = "System.Text.Json.Nodes.JsonArray"</DefineConstants>
</PropertyGroup>
```

### JSON 変数の型ごとに構築する
では、プロジェクトで同時に 2 つの JSON 型を使用したい場合はどうなるでしょうか?
それもできます。コンパイラに自動的に型を推測させるのではなく、JSON 変数の型を記述する必要があるだけです。

```vb
Dim targetTypeJson As System.Text.Json.Nodes.JsonNode = {"A": 12345}
```

# 最後に
Visual Basic Advent Calendar 2022では記事に空きがあるので、使い方については別記事とします。

https://qiita.com/yaju/items/afc811e9b28a77783a58

変数にJSonの値をセットするところで`BC37324`エラーで赤線になってしまって何が悪いんだろうと見直してみたら、通常の「Newtonsoft.Json」をNuGetでインストールしてました。ここではModVB用の「Newtonsoft.Json」をインストールする必要がありました。これをインストールしたら赤線は出なくなりました。