.NET6でできることをサンプルを交えて

このページは、[祝 .NET 6 GAアドベントカレンダー](https://qiita.com/advent-calendar/2021/microsoft)6日目の記事です。

# 祝.NET 6 GA

ようやっと出ました。
previewが出てはインストールし、Xamarinの後継という[MAUI](https://github.com/dotnet/maui)の状態を確認する日々…。（誇大）
それもこれもMAUIのため…。

## MAUI

MAUIは、デスクトップ／モバイル含めた複数のプラットフォームに対応したフレームワークです。
共通のソースから各プラットフォーム用のアプリを作ることができるようになっています。

自分はMAUIに注目してますが、.NET6では他の形式のアプリケーションも作ることができます。
その自由度の高さが.NETの好きなところでもあります。
また、[NuGet](https://www.nuget.org/)で公開されているライブラリの多さも好きなところです。

## コンソールアプリ

コマンドラインから使用するコンソールアプリも作ることができます。
Windowsなら.exeのファイル、LinuxやmacOSなら拡張子無しで実行できるアプリケーションですね。
.NET6から`namespace`で中カッコが不要になったり、`Main`関数の形にしなくてよくなったりで、なんだかスクリプト言語のような雰囲気にしつつ、バイナリにできるので高速に実行できる、ということになってます。

## Webサーバーアプリ

単一の実行ファイルで、Webサーバーとして動かせるアプリを作成することができます。
MVCだったり.cshtmlだったり.razorだったりできます。
よくわかりませんね。

## WebAssemblyアプリ

Blazorという仕組み？でC#からWebAssemblyを作ることができます。
ページは.razorで作ります。

という風に、いろんなものが出来上がるんですが。
ええい、もうお前のよくわからん話はもういい、サンプル見せろサンプル。
ということで、サンプル作ってみました。

# サンプルコード

コードは[GitHub](https://github.com/yakumo/ScrapingTest)に置きました。
何をするアプリかというと、某電子書籍サイトの無料マンガの一覧を表示する、というものになっています。
(**勢いだけで作ってる**のでいろいろやらかしてます。触れないところは**見なかったこと**ということでお願いします)

各々のプロジェクトの説明では、どのようにプロジェクトを作ったか、も載せておきます。
まずはVisual Studioで開けるようにソリューションファイル作成

```shell
$ mkdir -p ScrapingTest/src ; cd ScrapingTest/src
$ dotnet new sln
```

## 各プロジェクト共通ライブラリ（[ScrapingTestCommon](https://github.com/yakumo/ScrapingTest/tree/main/src/ScrapingTestCommon))

以下のものが入っています。

- 本のタイトルや書誌URLをパッキングしたクラス
- サイトからWebページを読み込んで個別の作品に分ける

読んでくるために、[AngleSharp](https://www.nuget.org/packages/AngleSharp/0.16.1)というライブラリを使っています。
`FreeBookScraping.cs`の63行目で読み込んで65～75行で各タイトルに分けています。
**LINQ万歳！**

```shell
$ mkdir ScrapingTestCommon ; cd ScrapingTestCommon
$ dotnet new console
$ dotnet add package AngleSharp --version 0.16.1
$ cd ..
$ dotnet sln add ScrapingCommon
```

## コンソールアプリ（[ScrapingTestConsole](https://github.com/yakumo/ScrapingTest/tree/main/src/ScrapingTestConsole)）

上記共通ライブラリで読み込んだタイトル一覧を出力するコンソールアプリです。
コマンドラインの解析に[System.CommandLine](https://www.nuget.org/packages/System.CommandLine/2.0.0-beta1.21308.1)というライブラリを使っており、コマンドラインオプション解析が超超楽にできました。

```shell
$ mkdir ScrapingTestConsole ; cd ScrapingTestConsole
$ dotnet new console
$ dotnet add package System.CommandLine --prerelease
$ dotnet add reference ../ScrapingTestCommon
$ cd ..
$ dotnet sln add ScrapingTestConsole
```

## Windowsアプリ（WPF）（[ScrapingTestWpf](https://github.com/yakumo/ScrapingTest/tree/main/src/ScrapingTestWpf)）

`WinUI`だ`Windows App SDK`だと新しく出ていますが、まだまだWPFで作りますよ。
という方にも答えてくれる.Net6。
こういうアプリではやはり[ReactiveProperty](https://www.nuget.org/packages/ReactiveProperty/)は外せません。
（といっても、これくらいのアプリなら使う必要もないのですが…）

```shell
$ mkdir ScrapingTestWpf ; cd ScrapingTestWpf
$ dotnet new wpf
$ dotnet add package ReactiveProperty
$ dotnet add reference ../ScrapingTestCommon
$ cd ..
$ dotnet sln add ScrapingTestWpf
```

## Webサーバーアプリ（[ScrapingTestWebSerer](https://github.com/yakumo/ScrapingTest/tree/main/src/ScrapingTestWebServer)）

共通ライブラリで読み込んだタイトル一覧を表示するWebサーバーのアプリです。
確か以前は`Controller`と`View`で出来上がってたと思ったのですが、これらがパッキングされるようになった（`Pages/Index.cshtml`と`Pages/Index.cshtml.cs`）んですね。

```shell
$ mkdir ScrapingTestWebSerer ; cd ScrapingTestWebServer
$ dotnet new webapp
$ dotnet add reference ../ScrapingTestCommon
$ cd ..
$ dotnet sln add ScrapingTestWebSerer
```

## WebAssemblyアプリ（[ScrapingTestPwa](https://github.com/yakumo/ScrapingTest/tree/main/src/ScrapingTestPwa)）

サーバークライアント形式です。
PWAにしてしまうと、別サイトからデータを取ってこようとしても取ってこれないのですね。
なので、共通ライブラリはサーバー側が使用し、クライアントはAPIで取ってくる、という風になっています。
クライアントはまたもや[ReactiveProperty](https://www.nuget.org/packages/ReactiveProperty/)を使っています。

```shell
$ mkdir ScrapingTestPwa ; cd ScrapingTestPwa
$ dotnet new blazorwasm -p -ho
$ cd Server
$ dotnet add reference ../../ScrapingTestCommon
$ cd ../Client
$ dotnet add package ReactiveProperty
$ cd ../..
$ dotnet sln add ScrapingTestPwa/Server ScrapingTestPwa/Client
```

## モバイルアプリ（[ScrapingTestMaui](https://github.com/yakumo/ScrapingTest/tree/main/src/ScrapingTestMaui)）

きました。**MAUI**です！
でもでも時間切れでした！
本当はShell使ってTabで切り替え、スクロールしていくと下にタイトル追加、とかやりたかったんですが…。
眠さに負けました…。（ちゃんと計画立てとけよ、という話）

```shell
$ mkdir ScrapingTestMaui ; cd ScrapingTestMaui
$ dotnet new maui
$ dotnet add package ReactiveProperty
$ dotnet add reference ../ScrapingTestCommon
$ cd ..
$ dotnet sln add ScrapingTestMaui
```

MAUIのインストールなどは[以前の記事](https://qiita.com/yakumomo/items/109d24bfd1485d919068)見てくださいね。

# おわりに

と、こんな風に.NET6ならいろいろなアプリを作れます。
あとはあなた次第、ということで。