.NET 5 + VB でも WinForms がしたい！

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

昨年に「[.NET Core 3.x + VB でも WinForms がしたい！](https://qiita.com/yaju/items/a52087c84d27d426fe01)」という記事を書きました。
当時はWinFormsのデザイナーでポトペタが出来るようになったものの、ボタンを配置してクリックイベントの連携である Handles句が自動で記述されるようにはなっていませんでした。

# テンプレートにVBがある
Windows Forms App (.NET) がプロジェクト テンプレートに入りました。
![VBIDEテンプレート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/1aa59f0c-ed46-f099-fb1b-7bb4bcf30915.png)

# 環境
* Visual Studo 2019 Version 16.8.0
* .NET ５

# フォームデザイン

![WinFormVB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/a52d976f-09f7-bdfb-3233-fac61118aef2.png)

# ソースコード
今回はボタンを配置してクリックイベントの連携である Handles句が自動で記述されるようにはなっています。

```vb:ボタンイベント
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        MessageBox.Show("Hello! .NET 5")
    End Sub
End Class
```

# 結果
![WinFormVB結果3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/4f0dfbf2-2d52-dd05-8f31-a59e8f0bf238.png)

# 単一ファイルの配置と実行可能ファイル
>.NET Core 3.1 までは単一ファイルとはいうものの、自己展開形式書庫ファイルのようなものでした。実行時に OS の Temp フォルダに必要なファイルが展開されるというものでした。(中略)
.NET 5 ではファイルが展開されることなく実行されます。
[.NET 5 の確認「単一ファイルの配置と実行可能ファイル」](https://rksoftware.hatenablog.com/entry/2020/11/29/130535)

「[単一ファイルの配置と実行可能ファイル](https://docs.microsoft.com/ja-jp/dotnet/core/deploying/single-file)」を行うには、プロジェクトの右クリックメニューから「発行」を選択します。

公開先として、今回はフォルダを指定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/c3a68706-9efe-8648-51dc-29ce758c58e0.png" width=75%>

フォルダの場所は、そのままのpublishフォルダ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/c558750a-f71c-f079-4646-c43a046ed4d0.png" width=75%>

単一ファイルにするために、「編集」リンクをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/c96bce95-b474-b170-ab31-3cf42a2b875c.png" width=75%>

配置モードを「自己完結」とターゲット ランタイムを、「win-x64」にします。
ファイルの公開オプションで「単一ファイルの作成」にチェックを付けます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/6b4d681b-0e20-5b25-7b33-7b8ee987db30.png" width=75%>

「発行」ボタンをクリックした結果が下記となります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/3588b53e-a95c-7ee7-11a4-af47a2b99077.png" width=75%>

WinFormsApp1.exe のプロパティでサイズを確認すると 126MByteになっています。巨大なサイズですね。
しかも、単一ファイルなので１ファイルになるのかと思いきや、結構なファイルが出来ています。
この中で不要なのは「pdp」ファイルくらいでしょう。

※ファイルの公開オプションのところで「未使用のアセンブリをトリミングする」にチェックを付けた場合、126MByte→65.6MByte と半分くらいにはなりました。

>単一ファイル公開ウィンドウ： dotnet publish -r win-x64 /p:PublishSingleFile=true
公開されたファイル：、、、、、HelloWorld.exeHelloWorld.pdbcoreclr.dllclrjit.dllclrcompression.dllmscordaccore.dll
ご覧のとおり、Windowsでは、単一ファイルの自己完結型アプリケーションには、アプリ以外に4つの追加ファイルが必要です。これらのランタイムファイルを単一ファイルアプリに含めることができませんでした。現在、これらの余分なファイルをWindowsで非表示にするための技術的な計画はありませんが、それが望ましいと理解しています。
[Announcing .NET 5 Preview 4 and our journey to one .NET](https://devblogs.microsoft.com/dotnet/announcing-net-5-preview-4-and-our-journey-to-one-net/)

今回はWinFormsなので、追加ファイルが多いようです。単一ファイルなので exeファイル1つという考えはしない方がいいようです。

>PublishSingleFile
Windowsでの出力は、正確に1つのファイルではありません。出力フォルダーには11個のファイルがあります。これらは、アプリケーションを実行するために必要なネイティブの依存関係です。
[Zero Installer, Zero MSIX, Zero Packaging with .NET Single File Apps](https://nicksnettravels.builttoroam.com/single-file-apps/)

# 最後に
今回はプロジェクト テンプレートが公式に追加されたので、苦労はしなかったです。なので、単一ファイルの生成についての記事を追加しました。
ファイルサイズが大きいなんて気にしてはいけない時代になっているってことですよ。

単一ファイルの配置と実行可能ファイルの画像のところは、下記の方法で75%にしています。
[Qiitaの記事の画像のサイズを変えてみた](https://qiita.com/soratyan/items/6c47abaf92dded703d0c)