Microsoft Build 2020 で発表された情報まとめ

# TL;DR

- [Build 2020](https://news.microsoft.com/ja-jp/features/build2020/)で発表された情報のうち興味がある情報に関して、要約と所感（一部）を記載します。（デスクトップアプリケーションの情報に偏っている可能性があります）

- 公式ブログ、[Microsoft Developer Blogs](https://devblogs.microsoft.com/)、[Windows Blogs](https://blogs.windows.com/)のリンクを載せています。
  - ブログのコメント欄にもいろいろ有用な情報が載っています。
- 以下について記載
  1. [Windows Package Manager プレビュー](#1-windows-package-manager-%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC)
  1. [Windows Terminal 正式リリース](#2-windows-terminal-%E6%AD%A3%E5%BC%8F%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9)
  1. [.NET Multi Platform UI (.NET MAUI) 発表](#3-net-multi-platform-ui-net-maui-%E7%99%BA%E8%A1%A8)
  1. [Blazor WebAssembly 正式リリース](#4-blazor-webassembly-%E6%AD%A3%E5%BC%8F%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9)
  1. [.NET Core用のWinFormsデザイナーのリリース](#5-net-core%E7%94%A8%E3%81%AEwinforms%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9)
  1. [ML.NET Model BuilderのVisual Studioへの統合](#6-mlnet-model-builder%E3%81%AEvisual-studio%E3%81%B8%E3%81%AE%E7%B5%B1%E5%90%88)
  1. [Win3とUWPの統合 Reunionプロジェクト](#7-win3%E3%81%A8uwp%E3%81%AE%E7%B5%B1%E5%90%88-reunion%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)
  1. [.NET 5 プレビュー4](#8-net-5-%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC4)
  1. [WSL2](#9-wsl2)
  1. [Xamarin アップデート](#10-xamarin-%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88)
  1. [Entity Framwork 5.0 プレビュー4](#11-entity-framwork-50-%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC4)
  1. [C# 9.0](#12-c-90)
  1. [Live Shareがチャットと通話をサポート！（プレビュー）](#13-live-share%E3%81%8C%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%A8%E9%80%9A%E8%A9%B1%E3%82%92%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC)
  1. [Azure DevOpsに追加される機能](#14-azure-devops%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%82%8B%E6%A9%9F%E8%83%BD)
  1. [ASP .NET Core プレビュー](#15-asp-net-core-%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC)

# 1. Windows Package Manager プレビュー

https://devblogs.microsoft.com/commandline/windows-package-manager-preview/

## 1.1. 要約

- Microsoft公式のコマンドラインパッケージマネージャーがリリース！（2020年6月2日現在プレビュー版）
- ソフトウェアの必要な場所からのダウンロードとインストールを自動化することができる。
  - 最新バージョン（または指定した正確なバージョン）を検索してインストール
  - `search`、`show`コマンドで使用可能なパッケージの検索
- 新たにパッケージマネージャーを作成した理由
  - 信頼されたアプリケーションのリポジトリを構築し、悪意のあるソフトウェアがリポジトリやマシンに侵入する可能性を減らす。
  - パッケージマネージャーをネイティブWindowsアプリケーションとして提供する。
- すべてのWindows 10バージョンをサポートしている

## 1.2. インストール

以下のいずれかの方法となる。私はGitHubから入手しました。

1. [GitHub](https://github.com/microsoft/winget-cli/releases)
2. Insiderプログラムに参加し、Microsoft StoreからApp Installerを入手。[詳細手順](https://devblogs.microsoft.com/commandline/windows-package-manager-preview/)
    1. [Windows Insider](https://insider.windows.com/ja-jp/)
    2. [Windows Package Manager Insider Program](https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR-NSOqDz219PqoOqk5qxQEZUNFkzQVcxMkJXWEFCUkE4WThQWUJMVlA1Ty4u)

## 1.3. 所感

これはかなり便利になると感じました。

例えば、Azureのチャットボット開発を使用とすると様々なツールが必要になります。

しかしパソコンクラッシュ時などにすぐに環境を整備したいということになると、必要なページを探し回る必要がありましたが、以下のコマンドを実行するだけで必要な環境をそろえることができます。

他の方に環境をそろえてもらう際などもかなり便利になると感じます。

```posh
winget install -e --id Microsoft.PowerShell
winget install -e --id Microsoft.VisualStudioCode
winget install -e --id Microsoft.AzureCLI
winget install -e --id Microsoft.BotFrameworkEmulator
winget install -e --id Microsoft.BotFrameworkComposer
winget install -e --id Microsoft.AzureStorageExplorer
```

# 2. Windows Terminal 正式リリース

https://devblogs.microsoft.com/commandline/windows-terminal-1-0/

## 2.1. 要約

- タブとペイン分割から任意のコマンドラインアプリケーション（Windows PowerShell、コマンドライン、PowerShell、Azure Cloud Shell）を同時に使用できる。
- 各タブ、ペインは独立したインスタンスで実行されているため、仮にクラッシュしたとしても他に影響は及ぼさない。
- 新PowerShell、WSLがインストールされている場合は自動で認識する。
- GPUによる高速レンダリングがあり、豊富なカスタマイズ（色設定、カスタムフォント含め）が可能である。
- 正式版リリース！
- インストールは[GitHubページ](https://github.com/microsoft/terminal/releases)、または先ほど紹介した[winget](https://github.com/microsoft/winget-cli/releases)コマンドで。

    ```posh
    winget install -e --id Microsoft.WindowsTerminal
    ```

## 2.2. 所感

様々なコマンドラインツールがあるのはよいが、呼び出し方がわかりづらくなっていたところがあるので、それだけでも使う意味があると感じました。

遊び心があるのもいいですね！Ironymanさんによる[レトロコマンドプロント](https://devblogs.microsoft.com/commandline/wp-content/uploads/sites/33/2020/05/retro-1.0.gif)もいい感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/3b8da016-95d8-6686-4efc-768882fbc20d.png)

[こちら](https://docs.microsoft.com/ja-jp/windows/terminal/custom-terminal-gallery/retro-command-prompt)を元に作成しましたが、フォントサイズとフォント名のみ変更しています。

```json
                "fontSize": 14,
                "fontFace": "ＭＳ ゴシック",
```

# 3. .NET Multi Platform UI (.NET MAUI) 発表

https://devblogs.microsoft.com/dotnet/introducing-net-multi-platform-app-ui/

## 3.1. 要約

- .NET Multi-Platform UI (.NET MAUI)とは、新しく作成されたUIフレームワーク。
- クロスプラットフォームを対象としながらも、ネイティブUIを実現できる
- Xamarin Formsツールキットの進化版の位置づけ。
- 複数のプラットフォームを対象とするプロジェクト構造を1つのプロジェクトで開発できる。
  - デスクトップ、エミュレーター、シミュレーター、物理デバイスへワンクリックで展開
  - 任意のイメージ、フォントを単一のプロジェクトで管理。ターゲットに応じたネイティブUIが自動的に作成されるため、プログラマーはコードを書くだけでよい。
  - 特定のオペレーティングシステム用のソースコードを追加し、ネイティブAPIにアクセスすることも可能。
- 既存のアプリパターン（MVVM）に加え、最新のアプリパターン（MVU）をサポートする。
- .NET 6を対象としていて2020年末にプレビュー版を出す予定。

![img](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2020/05/maui-02-1536x864.png)
引用元：https://devblogs.microsoft.com/dotnet/introducing-net-multi-platform-app-ui/

## 3.2. 所感

今までもXamarin Formsというフレームワークがありました。しかしXamarin Formsの進化系ということで、端的に言うと各OS向けのユーザーインタフェース記述をなくし、1つのコードで複数プラットフォーム向けのアプリケーションを作成できるということかと思います。

Xamarin Formsは、iOS、Android、UWP向けであり、WPFなどのWindows デスクトップアプリケーションには正式には対応していませんでした。

しかし今回の.NET MAUIは、**Windowsデスクトップアプリケーション**にも対応している（上記ブログのコメントによれば、UWP と WPF の両方が単一の Xamarin.Forms アプリからターゲットとできる）ということで、ネイティブアプリケーション作成時の選択肢として興味深いので、動向を注視していきたいと思います。

## 3.3. 参考

https://www.publickey1.jp/blog/20/uinet_multi-platform_app_uinet_mauimicrosoft_build_2020.html

# 4. Blazor WebAssembly 正式リリース

https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-now-available/

## 4.1. 要約

- Blazor WebAssemblyが正式にリリース
  - Blazor WebAssemblyはWebAssemblyの機能を利用しブラウザ上で動作する。プラグインは必要なく（デスクトップとモバイルの最新のOS上で動作）、JavaScirptと同様にブラウザのセキュリティサンドボックス内で安全に実行される。
  - C#で開発するだけでブラウザで動作する。つまりJavaScirptを記述する必要がない。
- 機能を抜粋
  - C# の生産性と強力なランタイム型指定を活用できる。
  - クライアントとサーバー上のコードと既存の .NET Standard ライブラリを簡単に再利用できる。
  - アプリをスタンドアロンの静的サイトとして展開するか、ASP.NET Core でホストする。
  - オフライン機能とネイティブ OS 統合を使用して、プログレッシブ Web アプリ (PWA) を構築できる。
  - 起動高速化のための機能がある（[トリミング](https://docs.microsoft.com/ja-jp/aspnet/core/host-and-deploy/blazor/configure-linker?view=aspnetcore-3.1)と圧縮）

## 4.2. 所感

ASP.NET WebFormsが.NET Coreでは廃止されました。

色々悪評も多くセキュリティ的には問題があるASP.NET WebFormsでしたが、覚えることを減らすことができるという意味で内部向け業務アプリ作成では有用と感じていました。

de:code 2019でASP.NET WebFormsからの移行パスとして示されたBlazor WebAssemblyでしたが、なかなか正式版が提供されない状況でした。しかし今回正式版として公開されたということで、選択肢の1つとして選びやすくなり嬉しく感じています。

起動速度が遅い問題についても対策されているようです。[公式サイト](https://docs.microsoft.com/ja-jp/aspnet/core/host-and-deploy/blazor/configure-linker?view=aspnetcore-3.1)を見る限り、トリミングには入念なテストが必要なようですが。

## 4.3. 参考

[ASP.NET Core Blazor WebAssembly と Web API と Entity Framework Core で SQL Server のデータを取得したり追加したり更新したり削除したりする](https://qiita.com/tamtamyarn/items/835ca4bd262ae35cfe5a)

- 実装例についてEntiry Framework、Web APIを利用した実装まで記載されたチュートリアルとして非常に参考になります。

[GAになったBlazor WebAssemblyでReactで書かれたTodoMVCのアプリを移植してみた](https://qiita.com/taiju/items/a8389d1c845bfd00c880)

- Reactのアプリを移植してみた、という例です。デバッグ時の感想例や、SPAアプリをGitHub Pages にホストするノウハウなども載っています。

# 5. .NET Core用のWinFormsデザイナーのリリース

https://devblogs.microsoft.com/dotnet/windows-forms-designer-for-net-core-released/

## 5.1. 要約

- Visual Studio 2019 16.6から、.NET Core 用のWinFormsデザイナーがのプレビュー版が利用可能に！
- 既定では無効なので、オプションから有効にする。（[ツール] > [オプション] > [環境] > [プレビュー機能]）
- 以下の機能がこれからの実装。16.7では一部が使用できる。
  - TableLayoutPanel
  - プロジェクトリソース
  - 完全なローカライズ
  - 継承されたダイアログ
  - データバインディング
  - サードパーティーのコントロールベンダーのサポート（DevExpress、GrapeCityなどと協力）
- 既知の問題
  - パフォーマンスはこれから改善予定
  - ツールボックスに一部のコントロールが表示されないことがある（改善予定）が、ツールボックスをリセットすることで改善できる（詳細は原文参照）

## 5.2. 所感

一時NuGetから入手できなくなっていたWinFormsデザイナーですが、Visual Studio 2019に同梱される段階まできました。

Windows向けのちょっとしたツールを作成する際には生産性が高いこと、すでにWinFormsで作成されたアプリケーションの移行先としてWinFormsを無視することはできないので、.NET 5リリースまでには正式版となってほしいと思います。

# 6. ML.NET Model BuilderのVisual Studioへの統合

https://devblogs.microsoft.com/dotnet/ml-net-model-builder-is-now-a-part-of-visual-studio/

## 6.1. 要約

- ML.NETは.NET開発者向けの機械学習フレームワーク。その中でも.NET Model Builderは、自動機械学習（AutoML）を利用し、.NET しか知らない場合でも画面からカスタムの機械学習モデルを作成できる。
- Visual Studio 16.6から組み込みで統合された（追加インストール必要なし）。
- **学習モデルのシナリオ例が追加**された。（今までは、テキスト分類、画像分類、値予測、おすすめ）。AutoMLでサポートされているわけではないが、ML.NETではサポートされておりチュートリアルからのサンプルコードが提供される。
  - 異常検出
  - クラスタリング
  - 予測
  - オブジェクト検出
- Azure トレーニングのスケールアップ

## 6.2. 所感

ML.NET Model Builderについては[記事](https://qiita.com/tfukumori/items/e11e0485fa21b84727a2)も記載しています。

実業務で活用しましたが、本来の業務アプリケーションのコードに集中することができ、生産性を高めることができたと思っています。

今回追加されたサンプルについても実業務で使う予定（オブジェクト検出）がありそうなので、試してみたいと思います。

# 7. Win3とUWPの統合 Reunionプロジェクト

https://blogs.windows.com/windowsdeveloper/2020/05/19/developing-for-all-1-billion-windows-10-devices-and-beyond/

## 7.1. 要約

- キーワードはRenuion（再会）。現在および将来のすべてのアプリ開発を統一する

    - WinUI3:
      
        Win32 アプリケーション（C++、WPF、WinForms、React Native）とUWPのインタフェースデザインに分離が生じていた。この状況を改善し、Win32 アプリケーションでもUWPのインタフェースを使用した魅力的なUIを使用できるプロジェクトが進んでいる

    - WebView2:

        どのWindowsアプリケーションでもEdgeとChromeの機能を利用してWebコンテンツを埋め込むことができるプロジェクトも進んでいる。OSから切り離されているため、特定のバージョンのWindowsに影響を受けない。


[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/30babf85-2b7a-59e5-6137-8d74c418fa3d.png)](https://46c4ts1tskv22sdav81j9c69-wpengine.netdna-ssl.com/wp-content/uploads/prod/sites/3/2020/05/2fb55acbe4b6ae5e347412c1926d1154.gif)
↑クリックでアニメーション表示
引用元：https://blogs.windows.com/windowsdeveloper/2020/05/19/developing-for-all-1-billion-windows-10-devices-and-beyond/

## 7.2. 所感

Win32アプリケーション（WPF、WinForms）の見た目がUWPアプリケーションに比べると昔風なのは、確かに気になるところでした（WPFならまだ変更するのは楽ですが）。

また、同じOSなのにデザインが統一されていないのは気になるところです。

一度MicrosoftがUWP推進のためにデザインを分割ということを指摘している記事もありましたが、改善を簡単に行えるのであれば歓迎したいところです。

## 7.3. 参考

### 7.3.1. 公式

https://github.com/microsoft/ProjectReunion
https://microsoft.github.io/microsoft-ui-xaml/
https://blogs.windows.com/windowsdeveloper/2020/05/19/introducing-winui-3-preview-1/
https://docs.microsoft.com/ja-jp/microsoft-edge/webview2/

### 7.3.2. 解説記事

https://ascii.jp/elem/000/004/014/4014034/
https://pc.watch.impress.co.jp/docs/news/1253193.html
https://www.itmedia.co.jp/news/articles/2005/20/news065.html
https://japan.zdnet.com/article/35154066/

# 8. .NET 5 プレビュー4

https://devblogs.microsoft.com/dotnet/announcing-net-5-preview-4-and-our-journey-to-one-net/

## 8.1. 要約

- パフォーマンス
- Windows ARM64でネイティブ実行
  - [サンプルアプリケーション](https://github.com/dotnet/samples/tree/master/windowsforms/Conway's-Game-of-Life/VB)は、VB.NETのWinFormsアプリケーションとなっています。
- 単一ファイルアプリケーション
- コンテナーのパフォーマンス向上や構築の簡易化
- 標準のJSON API

## 8.2. 所感

業務では、VB.NETを使うこともまだあります。

.NET 5では、[WPF/WinFomsアプリケーションではVB.NETがロードマップに追加された](https://devblogs.microsoft.com/vbteam/visual-basic-support-planned-for-net-5-0/)という計画もあるため、.NET 5には期待しています。

WinFormsデザイナーも同梱されるようになったため、引き続き確認していこうと思います。

# 9. WSL2

https://devblogs.microsoft.com/commandline/the-windows-subsystem-for-linux-build-2020-summary/

## 9.1. 要約

- WSL2が導入され軽量化と互換性の向上が図られた。Linux カーネルとのシステムコールの完全な互換性を提供し、WSLの以前のバージョンと比較して 3～6 倍高速となった。
- DockerのバックエンドとしてWSL2が採用された。
- WSLのインストールが楽になる。

    ```posh
    wsl --install
    ```

- WSLが**GPUサポートが今後数ヵ月内にInsiderビルドで提供される**。機械学習で使用されるGPUを使用した高速化を享受できる。以下の2つのシナリオが予定されている。
    - [NVIDIA CUDA](https://developer.nvidia.com/cuda/wsl)（NVIDIAのGPUに対応した方法）
    - [Direct ML](https://docs.microsoft.com/ja-jp/windows/win32/direct3d12/dml)（DirectX 12 と互換性のあるハードウェアに対応した方法）
- WindowsアプリとシームレスにデスクトップでGUIアプリを実行する計画がある

## 9.2. 所感

Tensorflow等を利用した機械学習を行う際はGPUを利用することで高速化します。もちろんWindows上でもGPUを利用しPythonで開発を行うこともできるのですが、色々と細かい設定も多く導入に苦労することも多いです。

ハードウェアに依存しないGPUの利用も含めて想定されているということもあり、GPUを使用したUnixの実行をWindows上で実行できるのであれば、実用性と有用性は高いと感じます。

## 9.3. 参考

https://devblogs.microsoft.com/directx/directx-heart-linux/

# 10. Xamarin アップデート

https://devblogs.microsoft.com/xamarin/microsoft-build-2020-xamarin/

## 10.1. 要約

- Xamarin.Formsの次の進化は、.NET MAUI。
- XAMLとMVVMに加えて、.NET MAUIはモデルビューアップデート(MVU)アーキテクチャを使用できる。

# 11. Entity Framwork 5.0 プレビュー4

https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-5-0-preview-4/

## 11.1. 要約

- .NET Standard 2.1が必要
- 数値型プロパティの精度と小数点以下桁数を指定できるようになった
- SQL Serverでインデックス作成時のFILL FACTORを指定できる

# 12. C# 9.0

https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0

## 12.1. 要約

- データシェイプの簡潔で不変な表現のサポート
  - レコード概念の導入。時間の経過に伴う変化を表すことができる
  - `with`式を使用した古いオブジェクトから違いを示した上での新しいオブジェクトの作成
  - 値ベースの等価性（オブジェクトとして異なるが値として同じ）
  - etc
- トップレベルのプログラム
  - クラス定義、Mainメソッドを省略し、メインプログラムをトップレベルに記載することができる
- パターンマッチングの改善


# 13. Live Shareがチャットと通話をサポート！（プレビュー）

https://devblogs.microsoft.com/visualstudio/live-share-now-with-chat-and-audio-support/

## 13.1. 要約

- コードの同時開発を行うことができるLive Shareに、チャットと音声通話機能が含まれるプレビュー機能が含まれるようになる。

# 14. Azure DevOpsに追加される機能

https://devblogs.microsoft.com/devops/azure-devops-roadmap-update-for-2020-q2/

## 14.1. 要約

- 親作業項目によるフィルター
- 複数のリポジトリからのチェックアウト
- etc

# 15. ASP .NET Core プレビュー

https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-5-preview-4/

## 15.1. 要約

- HTTP/2のパフォーマンス向上
- コンテナサイズの縮小

---

# 参考

[Microsoft Build 2020で発表されたWindows10の新機能](https://meow.gigowat.com/9154/)

- PowerToysが興味深い（macOS SpotLightのオマージュ、キーボードリマッパー）

[だいたい3分でわかるMicrosoft Build 2020](https://news.mynavi.jp/article/20200520-build2020/)

- 基調講演の内容メインで簡単にまとめられている

[Microsoft Build 2020基調講演 ざっくりまとめ速報](https://tech-lab.sios.jp/archives/19972) 

- Azure Static Web Apps + Cosmos DBの組み合わせがよさそう