.NET Core 3.0.0 Preview 6がリリースされました
2019年6月12日、「.NET Core 3.0.0 Preview 6」がリリースされました。リリース情報
「.NET Core 3.0.0 Preview 6」のリリース情報です。- リリースアナウンス:Announcing .NET Core 3.0 Preview 6
- リリースノート:.NET Core 3.0.0 Preview 6 - June 12, 2019
- ダウンロードとインストール:.NET Core 3.0.0 Preview 6 - June 12, 2019
- 主な変更点:Notable Changes in 3.0.0 Preview 6
- 不具合報告:.NET Core 3.0.0 Preview 6
- 既知の問題:.NET Core 3.0 Preview Known Issue
ドキュメント
- Migrating a Sample WPF App to .NET Core 3 (Part 1)
- Migrating a Sample WPF App to .NET Core 3 (Part 2)
- ASP.NET Core and Blazor updates in .NET Core 3.0 Preview 6
- Announcing Entity Framework Core 3.0 Preview 6 and Entity Framework 6.3 Preview 6
- API Difference netcoreapp3.0-preview5 vs netcoreapp3.0-preview6
Deb版.NET Core 3.0.0 Preview 6をインストールするには
現時点では、リポジトリーから「.NET Core 3.0.0 Preview 6」は提供されていないため、バイナリーを直接ダウンロードして「.NET Core 3.0.0 Preview 6」を起動してください。詳細は「ダウンロードとインストール」を参照してください。
Snap版.NET Core 3.0.0 Preview 6をインストールするには
Snap版「.NET Core 3.0.0 Preview 6」の利用が推奨されています。Snap版「.NET Core 3.0.0 Preview 6」をインストールするには、以下のコマンドを実行してください。
sudo snap install dotnet-sdk --beta --classic
「dotnet-sdk」は、以下のコマンドで利用できます。
dotnet-sdk.dotnet
もし「dotnet-sdk」コマンドで「dotnet-sdk.dotnet」を実行したいなら、以下のコマンドを実行してください。
sudo snap alias dotnet-sdk.dotnet dotnet
WPFとWindows Forms
WPFチームは、WPFの大部分のコードベースをGitHubに公開する作業が完了しました。- May Update for WPF on .NET Core 3.0
- Add WindowsBase, PresentationCore, PresentationFramework (+more) sources
WPFに詳しい人なら、アセンブリ名は非常に親しみある名称になっています。
Alpine Dockerイメージ
今までは「x64」向けのDockerイメージのみ提供されていましたが、「ARM64」向け「.NET Core」と「ASP.NET Core」のDockerイメージが利用可能になりました。以下のイメージを「Dockerfile」で指定したり、「docker pull」で利用可能です。
docker pull mcr.microsoft.com/dotnet/core/runtime:3.0-alpine-arm64v8
docker pull mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine-arm64v8
docker pull mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine-arm64v8
イベントパイプの改善
イベントパイプ(Event Pipe)がマルチセッションをサポートしました。イベントをプロセス内の「EventListener」で受け取るのと同時に、別プロセスのイベントパイプクライアントを利用することもできます。
dotnet-counters
パフォーマンスの管理ツールである「dotnet-counters」では、以下の計測項目が追加されました。- % Time in GC
- Gen 0 Heap Size
- Gen 1 Heap Size
- Gen 2 Heap Size
- LOH Heap Size
- Allocation Rate
- Number of assemblies loaded
- Number of ThreadPool Threads
- Monitor Lock Contention Rate
- ThreadPool Work Items Queue
- ThreadPool Completed Work Items Rate
「dotnet-counters」はイベントパイプを利用して構築されています。
「dotnet-counters」のインストール方法や利用方法は、以下を参照してください。
ReadyToRunイメージを利用した.NET Coreアプリの最適化
アプリケーションアセンブリーを「ReadyToRun(R2R)」フォーマットでコンパイルすることで、「.NET Coreアプリ」の起動時間を改善することができます。「R2R」は「Ahead Of Time(AOT/事前コンパイル)」コンパイルの一種です。
JITの作業量を軽減
「R2Rバイナリー」は、アプリの読み込み時に「JIT」が行う作業を軽減することで起動時間を改善します。「R2Rバイナリー」には、「JIT」が生成するようなネイティブコードが含まれており、起動時のパフォーマンスに最も影響を与える場面で「JIT」に少し余裕を与えます。
バイナリーサイズは増加
「R2Rバイナリー」には「ILコード(Intermediate Languageコード)」と、それに対応するネイティブコード(起動時間の改善に寄与する)の両方が含まれているため、バイナリーサイズは増加します。これはとあるシナリオで依然「ILコード」が必要になるためです。
.NET Core 3.0でサポート
「R2R」は「.NET Core 3.0」でサポートされ、それより前のバージョンではサポートされません。パフォーマンスの計測例
「WPF」サンプルアプリを利用してパフォーマンスを計測した例です。このサンプルアプリは自己完結型で、アセンブリーリンカーを使用していません。
サンプルアプリは以下を参照してください。
項目 | ILのみ | ReadyToRun |
---|---|---|
起動時間 | 1.9秒 | 1.3秒 |
メモリー使用量 | 69.1 MB | 55.7 MB |
アプリのサイズ | 150 MB | 156 MB |
ReadyToRunイメージとは
「R2Rコンパイル」は、ライブラリーとアプリケーションバイナリーに対し実行可能です。現時点では、ライブラリーはアプリの一部としてのみ「R2R」コンパイルが可能であり、「NuGet」パッケージとして提供されるバイナリーには適用できません。
そのサポートが必要ならフィードバックしてください。
NGEN
アセンブリのAOTコンパイルは長年.NETの構想として導入されてきたものであり、AOTはNGENまで遡ります。NGENはクライアントマシン上でコンパイルを実行しなければならないという欠点があります。
つまりアプリのビルド時にNGENイメージを生成することができないということです。
CrossGenとReadyToRun
「.NET Core」では「CrossGen」が導入され、「ReadyToRun」と呼ばれる新しいフォーマットでネイティブイメージを生成します。「ReadyToRunイメージ」は、アプリのビルド時にネイティブイメージを構築でき、実行準備が完了しているという名のとおり、クライアントマシンでの追加作業は必要ありません。
ILアセンブリーとReadyToRunアセンブリー
互換性の観点から言うと「ReadyToRunイメージ」は「ILアセンブリー」に似ていますが、以下の主な違いがあります。「ILアセンブリー」は「ILコード」だけを含むものです。
「ILアセンブリー」は動作に必要なフレームワークが提供されている環境なら、どこでも実行可能です。
例えば「netstandard2.0」アセンブリーは、「.NET Framework 4.6」以降及び「.NET Core 2.0」以降のフレームワーク上で動作可能です。
つまり「netstandard2.0」アセンブリーは、Windows/macOS/Linux、そしてIntel/ARMの32bit/64bitアーキテクチャー上で動作します。
その一方で「ReadyToRunアセンブリー」は、「ILコード」とネイティブコードを含みます。
これらは特定の最小.NET Coreランタイムバージョン及び実行環境(RID)向けにコンパイルされるものです。
例えば「netstandard2.0」アセンブリーをR2Rコンパイルするならば、「.NET Core 3.0」と「Linux x64」を指定してコンパイルすることになります。
この時「netstandard2.0」アセンブリーは、その環境もしくはその環境と互換性のある環境向けのネイティブコードを含んでいるため、その実行環境でのみ利用可能です。
現時点では自己完結型のみサポート
現時点で「ReadyToRun」は、SCD(自己完結型)でサポートされており、FDDではサポートされていません。将来的にFDDでもサポートされる予定です。
クロスプラットフォームとアーキテクチャー
現在ReadyToRunコンパイラーは、クロスプラットフォーム/アーキテクチャーをサポートしていません。アプリは実行対象と同じ環境でコンパイルする必要があります。
ただし以下の例外がああります。
Windows x64では、 Windows ARM32/ARM64/x86イメージのコンパイルが可能です。
Windows x86では、 Windows ARM32イメージのコンパイルが可能です。
Linux x64では、 Linux ARM32/ARM64イメージのコンパイルが可能です。
デフォルトでは無効になっている
「R2R」によるコンパイルは、デフォルトでは無効になっています。「R2R」によるコンパイルを有効にするには、開発者が明示的に「R2R」コンパイルを有効にする必要があります。
設定方法は上記リンク先を参照してください。
アセンブリーのリンク
「.NET Core 3.0 SDK」では、ILを解析して未使用のアセンブリーを取り除きアプリのサイズを削減するツールを提供しています。自己完結型のアプリを配布する際、必要なアセンブリーのみを含めるようにすれば、アプリのサイズを減らすことができます。
ILリンカー
ILリンカーを利用してアプリのILを調査し、実際に必要なコードの検出を行い、使用されていないフレームワークライブラリーを取り除きます。これによりアプリのサイズを有意に減らすことができます。
デフォルトでは無効になっている
この機能はデフォルトでは無効になっているため、開発者が明示的に有効にする必要があります。設定方法は上記リンク先を参照してください。
リンカーとR2Rの組み合わせ
この機能とR2Rを組み合わせれば、アプリのサイズをなるべく抑えつつ、起動時間を改善することができます。ただし現状WPF及びWindows Formsアプリで、リンカーとR2Rを組み合わせて使用することができません。
この問題は「.NET Core 3.0」リリース時に修正される予定です。
注意
リフレクションや動的な機能を使用するアプリ及びフレームワークでは、リンカーが動的な振る舞いを把握できず、アプリ実行時のリフレクションに必要なフレームワークタイプを決定できません。このようなアプリでは、リフレクションが必要とするすべてのタイプをリンカーに指定する必要があります。
また必ずアプリのテストを行い、動作に問題がないことを確認する必要があります。
詳細は以下を参照してください。
ネイティブホスティングのサンプル
ネイティブホスティングのサンプルが公開されました。これはネイティブアプリケーション内で「.NET Core」をホスティングするサンプルアプリです。
HTTP/2のサポート
「HttpClient」が「HTTP/2」リクエストの作成をサポートしました。デフォルトは「HTTP/1.1」のままですが、HTTPリクエストメッセージにバーションを指定することで「HTTP/2」を利用できます。
また「HttpClient」の「DefaultRequestVersion」プロパティーにバージョンを指定することで「HTTP/2」を利用することも可能です。