.NET 6 Preview 6 がリリースされました

皆さんごきげんよう。本記事は、2021 年 7 月 14 日（米国時間）ポストされた **[Announcing .NET 6 Preview 6
](https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-6/)** の意訳のようななにかとなります。内容については下記が原文で、正となります。

https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-6/

-------------------------
#はじめに
.NET 6 Preview 6 をリリースしました (※注 : 米国時間 2021/07/14 日現在) 。Preview 6 は、リリース候補版 (Release Candidate) 期間に入る前の最後から 2 番目のプレビューとなります。リリース候補版の提供は、2 回行われる予定です。今回のリリース自体は比較的小さいものですが、Preview 7 はより大きなものになる見込みです。その後は、11 月の最終リリースに向けて、品質向上に専念していきます。

[**.NET 6 Preview 6**](https://dotnet.microsoft.com/download/dotnet/6.0) は、Linux、macOS、および Windows を対象としています。

https://dotnet.microsoft.com/download/dotnet/6.0

* [インストーラ、バイナリ](https://dotnet.microsoft.com/download/dotnet/6.0)
* [コンテナ イメージ](https://hub.docker.com/_/microsoft-dotnet)
* [Linux パッケージ](https://github.com/dotnet/core/blob/main/release-notes/6.0/install-linux.md)
* [リリース ノート](https://github.com/dotnet/core/blob/main/release-notes/6.0/README.md)
* [API 差分](https://github.com/dotnet/core/tree/main/release-notes/6.0/preview/api-diff/preview6)
* [既知の問題](https://github.com/dotnet/core/blob/main/release-notes/6.0/known-issues.md)
* [GitHub issue tracker](https://github.com/dotnet/core/issues/6467)

> **uikou 注** : 前回の Preview 5 は結構大量のリリース内容でした。詳細は[**こちら**](https://qiita.com/uikou/items/db61cc45180102118201)から。

https://qiita.com/uikou/items/db61cc45180102118201

Web、データ アクセス、クライアントのシナリオ関連の新機能の詳細については、[**ASP.NET Core**](https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-preview-6/)、[**Entity Framework Core**](https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-6-0-preview-6-configure-conventions/)、[**.NET MAUI**](https://devblogs.microsoft.com/dotnet/announcing-net-maui-preview-6/) の各記事を参照してください。

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

https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-6-0-preview-6-configure-conventions/

https://devblogs.microsoft.com/dotnet/announcing-net-maui-preview-6/

今回、.NET 6 Preview 6 から、[Visual Studio 2022](https://visualstudio.microsoft.com/vs/preview/vs2022/) サポートを踏まえ、[**VS 2022 Preview 2**](https://docs.microsoft.com/en-us/visualstudio/releases/2022/release-notes-preview#17.0.0-pre.2.0) で検証してきました。Visual Studio 2022 にて、.NET MAUI での開発、C# アプリのホット リロード、WebForms の新しい Web Live Preview など、.NET 6 向けに開発された Visual Studio ツール群を活用いただけます。また、統合開発環境 (IDE) エクスペリエンスにおける、その他のパフォーマンスの向上もはかっています。

https://qiita.com/uikou/items/3cadb250eaa0681a05c8

なお、.NET 6 は [Visual Studio for Mac 8.9](https://visualstudio.microsoft.com/vs/mac/) でもテストされています。

最新の .NET の機能に関するディスカッションについては、以下の [Conversations](https://devblogs.microsoft.com/dotnet/category/conversations/) をご覧ください。

https://devblogs.microsoft.com/dotnet/category/conversations/

#x64 エミュレーションのアップデート
macOS の Apple Silicon と Windows の Arm64 サポート対応が完了しました。残すは macOS の Apple Silicon 上、および Windows の Arm64 上での x64 **エミュレーション**のサポートです。
これを可能にするためには以下の 2 つを対応しなくてはなりません。

* [Side-by-side 対応インストーラ](https://github.com/dotnet/designs/pull/217)
* [.NET CLI による、First-class のアーキテクチャ・ターゲティング](https://github.com/dotnet/designs/pull/233)。（主に）すべてのシナリオで、ネイティブのアーキテクチャ SDK を利用可能にする。


> **<font color="DarkMagenta">注意</font>**
> <font color="DarkMagenta">Side-by-side のインストーラが利用可能になるまで（.NET 6 の後期を予定）、すべての x64 ビルドまたはすべての Arm64 ビルドをインストールする必要があります。**これらを切り替えたい場合は、Arm64 マシン上のすべての .NET バージョンをアンインストール、削除する必要があります**。これは残念なことですが、現時点での制限事項となります。</font>

#ツール : .NET SDK のオプション ワークロードの改善
検出や、管理をより優れた形で実施できるようにする 3 つの新しい[ワークロード コマンド](https://github.com/dotnet/designs/blob/main/accepted/2020/workloads/workloads.md
)を追加しました。

https://github.com/dotnet/designs/blob/main/accepted/2020/workloads/workloads.md

* `dotnet workload search` - インストール可能なワークロードの一覧を表示します。
* `dotnet workload uninstall` - ワークロードが不要になった場合に、指定されたワークロードを削除します。これは容量を節約するために適したオプションです。
* `dotnet workload repair` - 以前にインストールした全てのワークロードを再インストールします。
    * インターネット接続が切断されたためにインストールが途中で失敗した場合に効果的です。
    オプションのワークロードは複数のワークロードのパックで構成されているため、一部のワークロードはインストールに成功したものの、他のワークロードはインストールできていないという状態になってしまうことがあります。

以前のプレビューでは、以下のコマンドを追加しました。

* `dotnet workload install` - ワークロードをインストールします。
* `dotnet workload list` - インストールされたワークロードを一覧表示します。
* `dotnet workload update` - インストールされたワークロードをアップデートします。

#ライブラリ : System.DirectoryServices.Protocols の TLS サポートについて
Linux および macOS にて、[System.DirectoryServices.Protocols](https://docs.microsoft.com/ja-jp/dotnet/api/system.directoryservices.protocols?view=dotnet-plat-ext-5.0) で [TLS がサポート](https://github.com/dotnet/runtime/pull/52904)されました。Windows ではすでに有効になっています。.NET ユーザーは、LDAP サーバーとの安全な通信が可能になりました。

(Credit to : [@iinuwa](https://github.com/iinuwa) さん)

https://github.com/dotnet/runtime/pull/52904

https://docs.microsoft.com/ja-jp/dotnet/api/system.directoryservices.protocols?view=dotnet-plat-ext-5.0

#ツール : Crossgen 削除、Crossgen2 へのリプレース
[Crossgen2](https://devblogs.microsoft.com/dotnet/conversation-about-crossgen2/) は、既存のすべての crossgen シナリオで対応しました。このマイルストーンの進行に伴い、SDK から（旧）crossgen を削除しました。これに伴い、アクセス、利用はできなくなります。

Crossgen / Crossgen2 では、Publish する際のステップとして、.NET の中間言語 (IL) をネイティブ コードにプリコンパイルすることができます。プリコンパイルは起動時のパフォーマンス向上に役立ちます。Crossgen2 は、ゼロスクラッチで実装された、コード生成において革新的な、優れたプラットフォームであることがすでに実証されているツールといえるでしょう。例えば、crossgen2 は、crossgen(無印) よりも広範な IL パターンに対応したコードを生成することができます。

https://devblogs.microsoft.com/dotnet/conversation-about-crossgen2/

以下の MSBuild プロパティは、crossgen2 でプリコンパイルを有効にする方法を示しています。

```html
      <!-- Enable pre-compiling native code (in ready-to-run format) with crossgen2 -->
      <PublishReadyToRun>true</PublishReadyToRun> 
      <!-- Enable generating a composite R2R image -->
      <PublishReadyToRunComposite>true</PublishReadyToRunComposite>
```

#ライブラリ : sync-over-async のパフォーマンス向上
[Sync-over-async](https://devblogs.microsoft.com/pfxteam/should-i-expose-synchronous-wrappers-for-asynchronous-methods/) は一般的なブロッキングの一種です。

https://devblogs.microsoft.com/pfxteam/should-i-expose-synchronous-wrappers-for-asynchronous-methods/

スレッド プールのワーカー スレッドで発生すると、枯渇状態に陥る可能性があります。スレッド インジェクションが遅いと、キューに入っている他の作業の実行が遅れ、枯渇状態の解決が遅れる可能性があります。

今回の[変更](https://github.com/dotnet/runtime/pull/53471)により、sync-over-async がスレッド プール ワーカー スレッド上で発生する唯一のブロック ワークである場合に、デフォルトでのスレッド インジェクションの速度が向上しました。sync-over-async に対応するスレッド インジェクションの割合を設定するために利用可能ないくつかの新しい [`AppContext` の設定値](https://github.com/dotnet/runtime/blob/a7a2fd6543ff71cecbbfe901b81ee27a6cf428c0/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.Blocking.cs#L271-L314)が用意されています。

https://github.com/dotnet/runtime/pull/53471

https://github.com/dotnet/runtime/blob/a7a2fd6543ff71cecbbfe901b81ee27a6cf428c0/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.Blocking.cs#L271-L314

#ランタイム : W^X メモリ ポリシー
[W^X メモリ・プロテクション](https://github.com/dotnet/designs/blob/main/accepted/2021/runtime-security-mitigations.md#wx)の[サポートを有効にします](https://github.com/dotnet/runtime/issues/50391)。これは Apple Silicon マシンでは必須の設定であり、他の OS でも有用なセキュリティ対策です。

https://github.com/dotnet/designs/blob/main/accepted/2021/runtime-security-mitigations.md#wx

https://github.com/dotnet/runtime/issues/50391

この機能にはちょっと風変わりな名前がついていますが、「write *<font color="DarkMagenta">exclusive</font>* execute」と読んでください。つまり、メモリ ページは、読み取り/書き込み、読み取り/実行のいずれかにマークすることができますが、**書き込みと実行双方を含むいかなる組み合わせもできない**ということです。書き込み/実行ページは、バッファ オーバーラン攻撃などで悪用される可能性があるためです。

| メモリ ページのマーク     |  ポリシー |  
|:-----------------|:------------------:|
| 読み取り / 書き込み |〇|
| 読み取り / 実行 |〇|
| 書き込み / 実行 |×|

この機能は、書き込み/実行 メモリ ページが使用されているところでは、製品全体で変更する必要があります。例えば、Preview 6 では、私たちが採用した [W^X スキームに JIT が連携する必要がある変更](https://github.com/dotnet/runtime/pull/53173)が含まれています。

https://github.com/dotnet/runtime/pull/53173

なお、W^X ポリシーは、Apple Silicon マシン上の macOS の要件であり、.NET 6 のその他の環境ではオプション扱いとなりますが、将来的に、.NET 7 のリリースにおいて、全環境を対象として既定値として設定される可能性があります。

> <font color="DarkMagenta">注：W^X ポリシーの実装には、Apple Silicon を除くすべての環境で、.NET 6 のスタートアップ リグレッションがあります。これは、.NET 7 の一部として解決される予定です。Apple Silicon の実装では、OS がこのシナリオをサポートしているため、このようなリグレッションはありません。</font>

#CodeGen changelog
Preview 6 には、以下の CodeGen 関連の変更で含まれています。

##Dynamic PGO
* 保護された devirt クラスをランダムに選択するオプションの追加

https://github.com/dotnet/runtime/pull/53399

* PGO/devirt 診断の改善

https://github.com/dotnet/runtime/pull/53247

##LSRA
[LSRA](https://github.com/dotnet/runtime/blob/main/docs/design/coreclr/jit/lsra-detail.md) のヒューリスティック選択のリファクタリング

https://github.com/dotnet/runtime/blob/main/docs/design/coreclr/jit/lsra-detail.md

https://github.com/dotnet/runtime/pull/52832

* 現在、DEBUG モードでは、LsraOrdering (COMPlus 変数) があり、ヒューリスティックな順序を設定できます。
* レジスタのヒューリスティクスをチューニングして、最適なレジスター候補を選択して Spill させます。

https://github.com/dotnet/runtime/pull/53853

これらの変更によって、以下のような改善が見られました。

![spill](https://user-images.githubusercontent.com/63486087/124963432-a6d57580-dfd4-11eb-9549-e7d5a8231448.png)
![spill](https://user-images.githubusercontent.com/63486087/124963446-ac32c000-dfd4-11eb-9960-69832b72f7b2.png)
![spill](https://user-images.githubusercontent.com/63486087/124963455-b05edd80-dfd4-11eb-82a0-06de64fcc3f9.png)

その他の改善は以下を見てください。

* [Windows x86](https://github.com/DrewScoggins/performance-2/issues/6612)
* [Windows x64](https://github.com/DrewScoggins/performance-2/issues/6592)
* [General](https://github.com/DrewScoggins/performance-2/issues/6593)

##コード クオリティ
冗長な「test」命令を排除しました

https://github.com/dotnet/runtime/pull/53214

#おわりに / フィードバックのラストチャンス！ぜひお寄せください。
今後、製品リリースに向けて収斂していく予定です。今後はサービス リリースで使用しているのと同じ Bug bar を使って、最も緊急性の高いフィードバックにのみ対応していきます。フィードバックを保留されている方や、まだ .NET 6 をお試しになっていない方は、今すぐお試しいただき、是非フィードバックください！
今回のリリースに影響を与える最後のチャンスのタイミングが近づいております。

.NET 6 を素晴らしい製品にしていくために、これまでご協力いただいた皆様、そして今後ご協力をくださる皆様、そしてすべての .NET 開発者の皆様に、あらためて感謝いたします。

-------------

以上、[Richard](https://devblogs.microsoft.com/dotnet/author/rlandermicrosoft-com/) さんでした。
![ric](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2021/02/rich-150x150.jpg)
それではみなさんごきげんよう。