Microsoft .NET5の新機能

Microsoftの2番目のリリース候補である.NET5が10月13日に到着し、.NETFrameworkと.NETCoreの統合が一歩近づきました。新しい統合.NETプラットフォームは、2020年11月10日に一般提供される予定です。 

マイクロソフトは、リリース候補2を、ほぼ最終的なリリースであり、2つのRCの最後のものとして説明しています。最初のRCは9月13日に公開されました。.NET5.0リリース候補はdotnet.microsoft.comからダウンロードできます。

.NET 5の高レベルの目標には、統合された.NET SDKエクスペリエンスの提供、すべての.NET 5アプリケーションにわたる単一のBCL(基本クラスライブラリ)、および複数のオペレーティングシステムにわたるネイティブアプリケーションとWebアプリケーションの両方のサポートが含まれます。単一の.NET5ネイティブアプリケーションプロジェクトは、Windows、Microsoft Duo(Android)、Apple iOSなどのターゲットを、これらのプラットフォームでネイティブコントロールを使用してサポートします。

.NET 5の追加の目標には、高性能クラウドアプリケーションの構築のサポート、BCLでのより高速なアルゴリズム、ランタイムでのコンテナーのより良いサポート、およびHTTP3のサポートが含まれます。.NET 5.0には、Monoランタイムおよび.NETライブラリを介したWebAssemblyバイナリ形式のサポートが含まれています。null許容型の参照型注釈のセットも紹介されています。

.NET 5は、開発者がコード内の潜在的なバグを自動的に見つけられるようにすることも約束しています。その他の新機能には、Halfタイプ、16ビットを占めるバイナリ浮動小数点、および未使用のアセンブリをトリミングしてアプリケーションのサイズを縮小するアセンブリトリミングが含まれます。カスタマイズされたトリミングも強調表示されます。C#9の新しいパターンマッチングは、リレーショナル、論理、および単純な型パターンをカバーします。ClickOnce展開オプションが.NET5.0Windowsアプリと.NETCore3.1アプリでサポートされるようになりました。

新しい.NETプラットフォームは、パフォーマンスの向上も約束します。7月21日に到着したプレビュー7に関連する速報は、.NET 5での約250のパフォーマンス指向のプル要求を認めており、.NETCoreのパフォーマンスをフォローしている人にとっては嬉しい驚きが待っていることを示しています。 

.NET5プレビュー7速報に記載されているその他の追加と改善:

  • 新しいSystem.text.jsonJSON APIは、シリアル化時に値型プロパティのデフォルト値を無視する機能を提供し、シリアル化と配線コストを削減するのに役立ちます。これは重大な変更です。また、System.text.jsonに追加されたのは、シリアル化時に循環参照を処理する機能であり、APIシェイプが最終的なものになると予想されています。
  • ガベージコレクションGetGCMemoryInfoは、GCMemoryInfo構造体を返すメソッドを使用して、最新のコレクションに関する詳細データを公開するようになりました。GCMemoryInfoマシンとヒープのメモリと最新のコレクション、または指定された種類のGCの最新のコレクション(エフェメラル、フルブロッキング、またはバックグラウンド)に関する情報を提供します。このAPIの最も可能性の高い使用例は、ロギング/モニタリング、または完全なGCを要求するためにマシンをローテーションから外す必要があることをロードバランサーに示すことです。一方、別のGCの変更は、高価なメモリリセット操作をメモリ不足の状況に延期するために行われました。
  • .NETのアセンブリコードジェネレーターであるRyujitは、一部の境界チェックの省略を可能にすることから、テールの重複の改善や冗長なゼロ初期化の削除の改善に至るまでの機能強化を実現しています。Ryujitには、ARM64ハードウェア組み込み関数とAPI最適化も含まれています。

6月25日にリリースされた.NET5プレビュー6は、ユニバーサルWindowsプラットフォームアプリケーションを構築するためのAPIのコレクションであるWinRT(Windowsランタイム)の組み込みサポートを削除しました。これは重大な変更です。WinRTを使用する.NETCore3.xアプリは再コンパイルする必要があります。.NETチームとWindowsチームは、WinRTがWindowsで動作する方法を変更し、WinRTサポートを.NET 5のC#/ WinRTツールチェーンに置き換えています。C#/ WinRTは、C#のWinRTプロジェクションサポートを提供するNuGetパッケージツールキットです。

.NET 5プレビュー6のその他の変更: 

  • .NET 5 Preview 6 SDKには、WindowsARM64デバイスでのWindowsフォームのサポートが含まれています。WindowsARM64でのWindowsPresentationFoundationのサポートの追加に引き続き取り組んでいます。
  • RyuJITコードの品質改善は、構造体の処理と最適化をカバーして、冗長なゼロ初期化を削除します。また、ARM64ハードウェア組み込み関数の最適化とARM64用に生成されたコードの改善が進んでおり、コードサイズが削減されています。
  • プラットフォームサポートプランが更新されました。

6月10日にリリースされた.NET5プレビュー5には、次の新機能が含まれています。

  • RyuJIT JITコンパイラには、末尾呼び出しヘルパーのより高速で移植可能な実装があります。JITは、末尾呼び出しを実行するためにヘルパーが必要であることに気付いたときはいつでも、ランタイムにヘルプを要求します。RyuJITについても、ARM64ハードウェア組み込み関数の実装は継続的に進歩しています。RyuJITのその他の改善には、正規表現のコンパイルに影響を与えていた場合の速度の向上とIntelアーキテクチャのパフォーマンスの向上が含まれます。
  • .NETコードへの呼び出しを伴うネイティブバイナリのエクスポートが有効になりました。この機能の構成要素は、のAPIサポートをホストすることですUnManagedCallersOnlyAttribute。ネイティブエクスポートプロジェクトにより、カスタムネイティブエクスポートの公開が可能になります。COMのような高レベルの相互運用技術を必要とせず、クロスプラットフォームです。
  • DirectoryServices.Protocols サポートはLinuxとMacOSに拡張されています。
  • Alpine 3.12Linuxディストリビューションがサポートされるようになりました。

.NET 5.0リリース候補は、dot.net.microsoft.comからダウンロードできます。

5月19日にリリースされた.NET5 Preview 4では、次の新機能が導入されました。

  • C#9およびF#5言語のサポート。
  • F#で使用されるテールコールのパフォーマンスが向上しました。
  • パフォーマンスが向上しToUpperInvariantstring.ToLowerInvariant及び関連するパターン。
  • HTTP1.1およびHTTP2のパフォーマンスが向上しました。
  • 改善されたコールカウントメカニズム。
  • ジェネリックコードによって打撃を受けるパフォーマンスの断崖を排除するための内部ジェネリック辞書の動的拡張。
  • ヒープの断片化を減らすために固定されたオブジェクトヒープ。
  • 単一のバイナリからアプリケーションを実行する新しい単一ファイル公開タイプに基づく単一ファイルアプリケーション。

4月23日に発表された.NET5プレビュー3の拡張機能には、次のものがあります。 

  • ビット値の配列を管理するためのBitArrayクラスが更新され、ARM64組み込み関数を使用したARM64のハードウェアアクセラレーションによる実装が含まれるようになりました。 Microsoftによると、BitArrayのパフォーマンスは大幅に向上しているという。さらに、CLRのオンスタック置換(OSR)が実装され、現在実行中のメソッドによって実行されたコードを、メソッドの実行中に変更できるようになりました。これらのメソッドは「スタック上」でアクティブになっています。階層型コンパイルのパフォーマンス特性を改善するこの機能は、x64での実験的なオプトイン機能になりました。 RyuJITのもう1つの機能強化により、「末尾呼び出し」ポジション呼び出しの引数としての構造体のコード品質が向上します。 RyuJITは、ジェネリック医薬品のパフォーマンスの向上も期待されています。 
  • 参照を保持するためのサポートの追加がSystem.Txt.Jsonに追加され、JSONシリアル化の参照ループ処理が可能になりました。また、不変のクラスと構造体がJsonSerializerでサポートされるようになりました。null値の処理もサポートされるようになりました。
  • .NET SDKは、プロジェクトファイル内の.NET Frameworkターゲットフレームワークを指定して、NETFramework.ReferenceAssembliesNuGetパッケージを自動参照するようになりました。この変更により、.NETFrameworkターゲティングパックがインストールされていないマシンで.NETFrameworkプロジェクトを構築できるようになります。この改善はターゲティングパックに固有であり、他の考えられるプロジェクトの依存関係を考慮していません。

4月2日にリリースされた.NET5プレビュー2の特定の機能拡張には、次のものが含まれます。 

  • 生成されたマシンコードの品質を改善するために、RyuJITに多くの変更が加えられました。たとえば、重複ゼロの初期化がより積極的に排除され、null許容ボックスの最適化が以前に呼び出されました。
  • 異なるスレッドでのサーバーのガベージコレクションは、古い世代のオブジェクトによってライブで保持されているgen0 / 1オブジェクトをマークしながら作業を盗むことができるようになりました。スレッド間で作業を盗むと、一部のGCスレッドが他のスレッドよりもマークするのにはるかに長い時間がかかったシナリオでの一時的なGCの一時停止が短縮されます。さらに、固定オブジェクトヒープ(POH)機能の一部(ガベージコレクションの内部部分)が実装され、コレクターが固定オブジェクトを個別に管理できるようになりました。これにより、固定されたオブジェクトが世代別ヒープに及ぼす悪影響を回避できます。

3月16日にリリースされたプレビュー1には、RyuJITの正規表現のパフォーマンスの向上とコード品質の向上が含まれていました。

2020年11月の製品リリースにより、.NET5には次のものが含まれるように設定されています。

  • ASP.NET Core、Webアプリケーション用のオープンソースフレームワーク。
  • EntityFrameworkコアデータアクセステクノロジー。
  • WinForms。
  • WPF(Windows Presentation Foundation)。
  • Xamarinモバイルアプリデバイスモデル。
  • ML.NET。

Microsoftは、.NET 5は、あらゆるタイプのアプリケーションを構築するための単一の統合プラットフォームを提供すると述べました。同社は、Azureの負荷分散を使用して、トラフィックの半分を.NETWebサイトトラフィックから.NET5バージョンへのテストケースとして転送しています。 

Microsoftは、開発者が.NET Core 3.1を使用して新しいアプリケーションを構築し、それらを.NET5に移行することをお勧めします。