みなさんごきげんよう。本日はちょっと時間を空けちゃったんですが、.NET 7 の Preview 1 がリリースされたので、そこの記事を紹介させていただければと思います。
つい少し前に .NET 6 が出たばかりじゃない…と思いましたが、よく考えたらあれは 11 月だったので、それなりに時間がたっていたのかもしれません。...にしても早い。アジャイル開発恐るべし。
(2022/3/8 Update) ASP.NET Core のほうも訳してみたので記載します。
はじめに
米国時間 2 月 17 日、.NET の歴史における次のマイルストーンとして、.NET 7 Preview 1 が発表されました。なお、.NET 7 の ASP.NET Core Preview 1 と Entity Framework 7 Preview 1 も併せてリリースされています。
※日本語(2022/03/08 Update)
.NET 7 は、.NET 6 で確立した基盤上に構成されており、統一ベース ライブラリ、ランタイム、SDK セットや、よりシンプルになった開発環境、開発生産性の向上などを実現しています。さらに、クラウド ネイティブ シナリオのサポートの強化だけでなく、レガシー プロジェクトのアップグレードを支援するツールや、コンテナ上での作業をよりやりやすくしてくれるような、開発者のエクスペリエンスの簡素化などにフォーカスしています。
.NET 7 Preview 1 では、API へのアノテーションによる Null 許容性(nullability) のサポート、JIT コンパイラの最適化、新たな API、そして、より多くのホット リロードのシナリオ サポートなどが含まれています。
.NET は、製品、ライブラリ、ランタイム、ツールが含まれており、マイクロソフトだけでなく、社外を含めた複数のチームの共同作業によってリリースが行われています。今回の記事で取り上げようと思うテーマは広いですが、それでも .NET 7の主要なシナリオと投資のすべてを網羅しているわけではなくて、.NET 7 リリースに向けた重要な作業の一部に過ぎません。
私たちは、ASP.NET Core、Blazor、Entity Framework (EF) Core、WinForms、Windows Presentation Foundation (WPF)、およびその他のプラットフォームに幅広い投資を行う予定です。
今後の投資分野については、製品ロードマップに詳細がありますので、ごらんいただくことで今後の展望をお分かりいただけるのではないかと思います。
- ASP.NET Core , Blazor , Orleans ※注
- Entity Framework (EF) 7
- ML.NET
- .NET MAUI
- WinForms
- Windows Presentation Foundation (WPF)
- NuGet
- Roslyn
※注 : Orleans
Orleans は、Microsoft Research によって開発された、.NET によってクロス プラットフォームで分散型アプリケーションを構築するためのフレームワーク。単一のオンプレミス サーバーから、グローバル分散されているクラウド上の高可用性アプリケーションまで拡張可能。最大の特徴は、高度に並列化された分散システム特有の複雑さを、機能制限なしかつ開発者に負担を強いることなく両立させたプログラミング モデル。次項以降で触れます。
.NET 7 Preview 1 のダウンロード
Windows 版、Mac OS 版、Linux 版がダウンロード可能です。
.NET 7 は Visual Studio 17.2 Preview 1 上でテストされています。Visual Studio ファミリー製品で .NET 7 を試したい場合は、Preview Channel のビルドを使用することをお勧めします。Visual Studio for Mac の .NET 7プレビューのサポートはまだありませんが、近日中に提供される予定です。
モダン クライアント:.NET Multi-Platform App UI(.NET MAUI)
.NET MAUI は、.NET によるクロス プラットフォームのネイティブ UI のめざす形であり、.NET 7 の一部となる予定です。米国時間 2 月 1 日に、私たちは .NET MAUI Preview 13 をリリースしました。現在、私たちは .NET 6 の .NET MAUI サポートのリリースにフォーカスしており、間もなくリリース候補版(RC)をリリースできる予定です。RC 版が利用可能になった後、一般提供(GA)レベルの品質になるまで、追加でいくつか RC 版をリリースすることに集中したいと考えています。
.NET MAUI GA 版はまず .NET 6 向けにリリースされた後、.NET 7 に含め、内部開発ループのエクスペリエンスの改善、最新の .NET SDK ツールのサポート、より高速なアプリケーションのパフォーマンス、コード シェアリング、相互運用ストーリーの強化を検討する予定です。詳細は、.NET MAUI のステータスとプロジェクト ロードマップを参照ください。
モダン クラウド : クラウド ネイティブとコンテナ
クラウド ネイティブ アプリケーションは、データベース系サービスやホステッド コンテナ系サービスなど、最新の Web ベースのリソースを活用するべく構築されています。クラウド ネイティブ アーキテクチャは、アプリケーションの他の領域から独立してデプロイおよび拡張される自律的なサブシステム(一般的にはマイクロ サービスと呼ばれます)を作成することにより、大規模アプリケーションのスケールを向上し、長期的にコストを抑えられます。
マイクロサービス アーキテクチャは、モノリシック アーキテクチャでは実現困難なレベルの限界まで進化・拡張できるように設計されており、高い柔軟性もあるため、人気のあるアプローチとなります。
.NET 7 では、次のような開発者のエクスペリエンスの改善を模索することで、クラウド ネイティブ アプリケーションの構築を容易にします。
- セキュアな認証と認可の実装に必要なセットアップと設定の簡素化
- アプリケーションの起動と実行時のパフォーマンス向上
また、"分散型 .NET "と呼ばれる分散アプリケーション構築のための .NET クロスプラットフォームフレームワークである Orleans への投資を継続する予定です。包括的に Orleans のドキュメントを引き続き増強し、Azure App Services や Azure Container Apps といった既存のクラウド サービスとの連携を強化することで、Orleansをより使いやすく、実装しやすくしていきます。
今日では、多くの企業でクラウド ネイティブ アプリケーションやマイクロ サービスを展開する方法として、コンテナが推奨されています。一方で、コンテナに依存することで、コンプライアンスの管理、イメージの構築と公開、イメージの保護、イメージ サイズとパフォーマンスの合理化など、いくつかの課題が生じます。私たちは、.NET コンテナでより良いエクスペリエンスを実現する機会があると確信しています。
お客様がこれらの課題に直面された際の支援として、.NET 7 では、コンテナを使用した .NET 開発を大幅に改善する予定です。たとえば、SDK の新しい機能として、MSBuild を介してコンテナを直接ビルドすることを検討しています。また、テレメトリを強化し、コンテナの可観測性を向上させていく予定です。コンテナ イメージについてもより小さく、より速く、より安全にすることに注力しつつ、Rootless や Distroless といった要望の高いモデルについても検討してまいります。
モダナイズ: .NET アプリケーションのアップグレード
.NET 6 リリース以来、開発者は新しいパフォーマンスの向上、最小 API やホット リロードなどの生産性に関連する機能、および新しいランタイムと C# 言語の革新、ライブラリとツールの成熟したエコ システムを利用するために、アプリケーションをアップグレードしてきました。.NET 7 では、既存の .NET アプリケーションを最新の .NET プラットフォームとテクノロジに対応させることができます。
より多くのアナライザ、コード フィクサ、および .NET Upgrade Assistant の追加アプリケーション型のサポートにより、より多くのアプリケーション ポートフォリオを自信を持ってアップグレードできるようにして、アップグレードに伴う反復作業に費やす時間を短縮することができます。
また、.NET アプリケーション モデル(ASP.NET、WinForms、WPF など)にはそれぞれモダナイズに関するそれぞれの課題があり、開発者のみなさんが必要とする機能やプラットフォーム自体のサポートが不足している可能性があることも承知しています。WCF のようなものについては、明確な方向性が定まっていない場合もあります。これらの.NETアプリモデルのアップグレードを容易にするために、適切なガイダンス、ドキュメント、およびツールの提供に注力します。
サポート
.NET 7 は Current リリースであり、リリース日から 18 ヶ月間、無料のサポートとパッチを受けることができます。重要なのは、すべてのリリースの品質が同じであることです。LTSとCurrentリリースの唯一の違いは、サポート期間の長さです。.NET サポート ポリシーの詳細については、.NET および .NET Core の公式サポート ポリシーを参照してください。
大きな変更点
.NET 7 における最新の変更点については、.NET 7 の変更点に関するドキュメントをご覧ください。このドキュメントでは、カテゴリーとリリースごとの変更点のリストと、詳細な説明へのリンクが掲載されています。
現在、どんな変更点が提案中なのか、またレビュー中であるかを確認するには、Proposed .NET Breaking Changes GitHub issue をご覧ください。
プレビュー 1
Preview 1 リリースでは、以下の機能が利用可能になりました。
Microsoft.Extensions の Null 許容性 (nullability) アノテーション
Microsoft.Extensions.* ライブラリの Null 許容性に関するアノテーションを進めています。.NET 7 Preview 1では、以下のライブラリに Null 許容性のアノテーションが付与されています。
- Microsoft.Extensions.DependencyInjection.Abstractions
- Microsoft.Extensions.Logging.Abstractions
- Microsoft.Extensions.Primitives
- Microsoft.Extensions.FileSystemGlobbing
- Microsoft.Extensions.DependencyModel
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.FileProviders.Abstractions
- Microsoft.Extensions.FileProviders.Physical
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Binder
- Microsoft.Extensions.Configuration.CommandLine
- Microsoft.Extensions.Configuration.EnvironmentVariables
- Microsoft.Extensions.Configuration.FileExtensions
- Microsoft.Extensions.Configuration.Ini
- Microsoft.Extensions.Configuration.Json
.NET 7 がリリースされるまでに、すべての Microsoft.Extensions.* ライブラリの nullability のためのアノテーションを作成する予定です。残りのライブラリは dotnet/runtime#43605で見ることができ、進捗を追うことができます。
この作業の大部分に貢献してくれている @maxkoshevoi さんに、心より感謝を捧げます。maxkoshevoi さんの協力がなければ、私たちはここまでこれなかったでしょう。ありがとうございます!
オブザーバビリティ
トレース API の改善を継続して行っています。
-
ActivityContext.TryParse
にオーバーロードを追加することで、アクティビティ コンテキストが remote parent から伝搬された場合を含む
ActivityContext
オブジェクトの解析と作成が可能になりました(Related Issue) -
Activity
オブジェクトが停止しているかどうかを示すActivity.IsStopped
()メソッドを追加しました(Related Issue)
CodeGen
コミュニティの皆さんからの Pull request はこちら。(JIT コミュニティの Contributer の皆様に感謝です!)
From @am11
From @anthonycanino
From @SeanWoo
From @SingleAccretion
- Tune floating-point CSEs live across a call better runtime#63903
- Update hash of the new CSE when resizing runtime#61984
- Rewrite selection for fields and always normalize SIMD types in VN runtime#61370
- Add documentation on how VN numbers memory runtime#60476
- Improve value numbering for casts runtime#59841
- Address-expose locals under complex local addresses in block morphing runtime#63100
- Handle embedded assignments in copy propagation runtime#63447
- Exception sets: debug checker & fixes runtime#63539
- Implement the “moffset” encoding size optimization in emitOutputAM runtime#62896
- Compress operand kinds array and optimize OperIsLocal runtime#63253
- Make gtHasRef pay attention to LCL_FLD nodes runtime#62568
- Enable global constant propagation for GT_LCL_FLD runtime#61209
- Enable global constant propagation for small types runtime#57726
- Properly type primary selectors in fgMemoryVNForLoopSideEffects runtime#60505
From @weilinwa
ガイド付き最適化のプロファイル : 動的 PGO (Profile-guided optimization)
- OSR support for Arm64
- JIT: support OSR for synchronized methods
- JIT: handle interaction of OSR, PGO, and tail calls
- Add 2009 Jit Architecture Plan (excerpts)
- JIT: limited version of forward substitution for some relops
- JIT: save generics context for late devirtualization
参考 : 動的 PGO は .NET 6 から導入された JIT コンパイラのオプション。パフォーマンス向上が見込める。
Arm64
- Use SIMD operations in InitBlkUnroll/CopyBlkUnroll and increase unroll limit up to 128 bytes
- [Arm64] Keep unrolling InitBlock and CopyBlock up to 128 bytes
- ‘cmeq’ and ‘fcmeq’ Vector64.Zero/Vector128.Zero ARM64 containment optimizations
- [arm64] JIT: X % 2 == 0 -> X & 1 == 0
- [arm64] JIT: Add with sign/zero extend
- [arm64] JIT: Enable CSE/hoisting for “arrayBase + elementOffset”
- [arm64] JIT: Fold “A * B + C” to MADD/MSUB
ループ最適化
一般的な最適化
- Accelerate additional cross platform hardware intrinsics
- Implement Narrow and Widen using SIMDAsHWIntrinsic
- Add IsKnownConstant jit helper and optimize ‘str == “”‘ with str.StartsWith(‘c’)
- Allow JIT to keep HFA/HVA in the registers when passing them as argument/returning values
- Enable support for nint/nuint for Vector64/128/256
- Adding support for X86Base.Pause() and ArmBase.Yield()
- Use preferred region from PAL for JIT reloc hints
- Support fast tailcalls in R2R
- Allow contained indirections in tailcalls on x64
- Optimize indirection cell call sequences more generally
- Avoid additional local created for delegate invocations
相互運用:p/Invoke コード生成
.NET 6 でプロトタイプ化された p/invoke ソース ジェネレータを dotnet/runtime に統合して、ランタイム ライブラリを変換しました。これにより、変換された p/invoke 処理は AOT 互換となり、実行時に IL スタブ生成が不要になりました。
将来的には、p/invoke のソース ジェネレータはランタイム外でも利用可能になる予定です。今後の残作業は dotnet/runtime#60595 で確認いただけます。
System.Text.Json の新 API について
System.Text.Json には、いくつかの細かい品質向上のための改善が行われています。
- 開発者は、System.Text.Json が内部的に使用するデフォルトの
JsonSerializerOptions
シングルトンにアクセスできるようになりました (Related Issue) -
JsonWriterOptions.MaxDepth
プロパティを追加し、この値がシリアライズ時に同等のJsonSerializerOptions.MaxDepth
プロパティから流せるようにしました(Related Issue) -
System.Net.Http.Json
にPatch
メソッドを追加しました(Related Issue)
ホット リロードの改善
Blazor WebAssembly および .NET for iOS/Android の C# ホット リロードで、以下の編集が可能になりました(Related Issue)。
- 既存メソッドへの static lambda の追加
- キャプチャする lambda がすでに 1 つ以上ある既存のメソッドに、さらにキャプチャする lambda を追加する。
- 既存クラスへの新しい静的または非仮想インスタンスメソッドの追加
- 既存のクラスに新しい静的フィールドを追加する
- 新規クラスの追加
既知の問題 :
- 新しく追加されたクラスのインスタンスフィールドはサポートされません
- 既存または新規のクラスで新規に追加されたメソッドとフィールドは、リフレクションでは表示されません
これらの問題の対応状況は dotnet/runtime#57365 で確認いただけます。
.NET7 をターゲット設定にする
.NET 7 をターゲットに設定するには、プロジェクト ファイルで .NET 7 Target Framework Moniker (TFM) を使用する必要があります。
例)
<TargetFramework>net7.0</TargetFramework>
.NET 7の TFM のフルセットは、OS 固有のものを含め以下の通りになります。
net7.0
net7.0-android
net7.0-ios
net7.0-maccatalyst
net7.0-macos
net7.0-tvos
net7.0-windows
.NET 6 から .NET 7 へのアップグレードは簡単にできることを期待していますが、既存のアプリケーションを .NET 7 でテストする過程で、もし重大な変化などを発見された場合は、ぜひご報告ください。
おわりに
マイクロソフトの世界中のチームの様々なエンジニアたちが、熱心な開発者の方々や、コミュニティのみなさんと協力して .NET 7 を開発しています。学生の方から、プログラミングを趣味とされる方たち、オープンソースの Contributor の方々、そして企業の顧客の皆様まで、幅広く .NET を中心とした集まりが .NET 開発の中心となっています。皆さんが、新しいアイデアを提案くださり、定期的にコードを提供してくださることで、.NET のエコシステムが進んでいきます。私たちは、皆さまのサポート、貢献、そしていただたインサイトに感謝しています。
.NET 7 へようこそ!
以上、Jeremy Likness さん (Senior Program Manager - .NET Data, .NET) でした。
それではみなさん、ごきげんよう。