Blazor + Electron.NETを試してみた

# はじめに
本記事はBlazorとElectronを組み合わせてアプリ開発をするうえで調査して得た知見をまとめることを目的としています。　

# BlazorとElectron.NETとは？
簡単に、2つの技術について説明します。

- Blazorについて

C#を用いて、Webブラウザ上で実行可能なWebアプリケーションを構築するためのフレームワークです。サーバーサイドアプリをC#で開発することができます。
（Blazor WebAssemblyという技術でC#でクライアントアプリを開発することもできます。[過去記事](https://qiita.com/minoura_a/items/9d2cc884903d74bde324)で紹介しています。）

- Electron.NETについて

まず、Electronという技術があります。Electronとはクロスプラットフォーム（Windows／macOS／Linux）で実行できるデスクトップアプリをWeb技術（HTML＋CSS＋JavaScript）で開発できるフレームワークです。
Electron.NETとは、ASP.NET Coreを利用してElectronアプリケーションを構築できるフレームワークです。これは、Electronを.NETに移植したものではなく、ASP.NET CoreとElectronを組み合わせたもので、.NET のノウハウを生かして、Electronアプリケーションを開発できます。

Blazorで作成したWebアプリケーションにElectron.NETを組み合わせることでC#でマルチプラットフォーム（Windows／macOS／Linux）で実行できるデスクトップアプリも開発できるということになります。
WebアプリとデスクトップアプリをC#の共通コードで開発したいがために、この二つの技術について調査しました。

# Blazor + Electron.NETを試す
まず、VisualStudioでBlazorのサーバーアプリのテンプレートを選択してプロジェクトを作成します。
![2021-02-19_11h52_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562946/5a2ef312-c53a-4b5f-2abc-afd1706f8c94.png)

この後は[Electron.NET](https://github.com/ElectronNET/Electron.NET)のGithubのページの通り進めていきます。

プロジェクトにElectronNET.APIというNugetパッケージをインストールします。
![2021-02-19_11h58_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562946/1e0d32fb-ec46-5da6-d9d1-d9534ec71859.png)

プロジェクトにProgram.csおよび、Startup.csファイルがあると思うので、そこへ以下のように実装します。
Program.csでは、以下のようにWebHostBuilderの拡張メソッドでUseElectronメソッドを呼びます。

``` cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseElectron(args);
            webBuilder.UseStartup<Startup>();
        });
```

Startup.csでは、以下のようにElectronのウィンドウを開く処理を記述します。

```cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...

    // Open the Electron-Window here
    Task.Run(async () => await Electron.WindowManager.CreateWindowAsync());
}
```

ここまで出来たらあとは起動するだけです。準備が必要なので一旦VisualStudioを閉じます。一旦閉じないと、この後の操作が反映されないようです。

以下のコマンドでElectronNET.CLIツールをインストールします

```
dotnet tool install ElectronNET.CLI -g

```
以下のコマンドを先ほど作成したプロジェクトフォルダを作業フォルダとして実行します。
必ず最初に初期化が必要になります。

```
electronize init
```

もう一度VisualStudioを立ち上げると、以下の画像赤枠のようにElectron.NetAppという実行の形式が増えています。

![2021-02-19_12h17_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562946/5b8f5c82-24db-f003-a524-b4e50767763b.png)

これを実行すると、以下のようにBlazorのテンプレートのWebアプリケーションがデスクトップアプリとして動作します。
![2021-02-19_12h22_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562946/97784966-885a-5d32-25c4-48618c0d7c5c.png)

# デバッグ方法
VisualStudioで実行しただけでは、デスクトップアプリとして表示している場合、Blazorで記述したコードのデバッグはできません。
上記で起動したElectronのアプリケーションにアタッチすることで、Blazorで実装したコードをデバッグできるようになります。
毎回アタッチの操作はするのは面倒くさいですが、今はそれしかないようです。Electron.NETの開発者もそのように言っています。また、普段はWebアプリケーションとして開発し、ブラウザでデバッグするようにとのことでした。詳細は[こちら](https://github.com/ElectronNET/Electron.NET/issues/298)。

# さいごに
Blazorアプリとして発行すればWebアプリとして操作できますし、Electron.NETに乗せるとデスクトップアプリになるので、とても面白い技術だと思いました。
デスクトップアプリで使用しているときはローカルファイルを操作したいという用途も出てくると思いますが、Electronを使用しているためそういったこともできます。[こちら](https://narazaka.hatenablog.jp/entry/2019/12/24/Blazor%2BElectron_NET%E3%81%A7%E3%82%AF%E3%83%AD%E3%82%B9%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0GUI%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F%E6%99%82%E3%81%AE%E3%83%A1#:~:text=Web%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AA%E3%81%AE%E3%81%A7%E3%81%93%E3%82%8C%E3%81%AF,%E3%81%AA%E6%8A%80%E8%A1%93%E3%81%A8%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82)の記事が参考になりました。