29.3K Views
July 11, 23
スライド概要
【オンライン】Build 後! C# Tokyo イベントでの発表資料です
New Relic株式会社、Technical Support Manager.
ASP.NET Core 8で Native AOTを試してみよう Bu i l d 後 ! C# T o kyo イ ベ ン ト 2 0 2 3 / 0 7/ 11 @t a n a ka_7 33 2023/06/01 #dotnetjpcommunities 1
@tanaka_733 ◦ New Relic K.K. テクニカルサポートマネージャー ◦ C# Tokyo運営メンバー ◦ 福岡県出身 ◦ Microsoft MVP for Developer Technologies ◦ Certified Kubernetes Administrator & Application Developer (CKA/CKAD) 2023/06/01 #dotnetjpcommunities 2
Bingに聞いてみた 2023/06/01 #dotnetjpcommunities 3
なぜNative AOT? ディスク占有領域を最小限に 起動時間の短縮 必要なメモリの削減 2023/06/01 #dotnetjpcommunities 4
測定された実際の効果 https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/nativeaot?view=aspnetcore-8.0#why-use-native-aot-with-aspnet-core 2023/06/01 #dotnetjpcommunities 5
ASP.NET Coreとの互換性 すべての機能で利用できるわけではない MVC、Blazor Server、SignalR、認証、SPA、StaticFilesなどはNG gRPCと一部のMinimal APIが現状利用可能 https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/nativeaot?view=aspnetcore-8.0#aspnet-core-and-native-aot-compatibility Preview 5でAsParameters 属性によるメタデータ自動生成もサポート https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-8preview-5/#support-for-asparameters-and-automatic-metadata-generationin-compile-timed-generated-minimal-apis 2023/06/01 #dotnetjpcommunities 6
事前準備(開発要件) .NET SDK 8.0 preview(今回はpreview5を使用) Visual Studioの場合 ◦ Visual Studio 2022 preview ◦ ASP.NET とWeb開発 ◦ C++によるデスクトップ開発 Linuxの場合 ◦ .NET runtimeが依存するパッケージをインストール macOSの場合 ◦ Command Line Tools for XCode をインストール https://learn.microsoft.com/ja-jp/dotnet/core/deploying/nativeaot/?tabs=net7#prerequisites 2023/06/01 #dotnetjpcommunities 7
ASP.NET Core APIテンプレート Web APIでないことに注意 2023/06/01 #dotnetjpcommunities 8
Native AOTを有効にする 2023/06/01 #dotnetjpcommunities 9
dotnet publishで発行 Visual StudioのUIからの発行はNative AOTに未対応 2023/06/01 #dotnetjpcommunities 10
生成された実行ファイルを実行 2023/06/01 #dotnetjpcommunities 11
Native AOT対応のためのコード 赤: JSONシリアル化ソース生成 青: CreateSlimBuilderメソッド 2023/06/01 #dotnetjpcommunities 12
JSON シリアル化ソース生成 Native AOTは使われていないコードについては生成しないため、無制限のリフレクションが許 可されない JSONシリアル化はリフレクションを使っている 必要な部分をソース生成してリフレクションを利用しないように編集している 詳しくは https://learn.microsoft.com/jajp/dotnet/standard/serialization/system-text-json/source-generation 2023/06/01 #dotnetjpcommunities 13
JSON シリアル化ソース生成 指定したクラスのフィールドの型は自動的に対象 ただし、object型は例外である 実行時に利用される型を明示的に指定する List<T>な型を使う場合も指定する 2023/06/01 #dotnetjpcommunities 14
ソース生成されたコードを見る csprojで以下のオプションを設定 <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> obj\Release\net8.0\win-x64\generated\ に出力される 2023/06/01 #dotnetjpcommunities 15
CreateSlimBuilder メソッド CreateBuilder() メソッドではなく CreateSlimBuilder() メソッドでは最小限の構成が行われる HTTPSやHTTP/3はサポートされない 構成される要素 ◦ ◦ ◦ ◦ appsettings.json と appsettings.{EnvironmentName}.json の JSON ファイルの構成 ユーザー シークレットの構成 コンソールのログ ログの構成 2023/06/01 #dotnetjpcommunities 16
ソース生成のための注意事項 以下の機能などは利用できない ◦ ◦ ◦ ◦ ◦ Dynamic loading (Assembly.LoadFile) 実行時コード生成(System.Reflection.Emit) C++/CLI トリミング利用できない機能 単一ファイルへのコンパイルで利用できない機能 LINQはコンパイル時に解釈された通りに実行される。 これは実行時に生成されるコードよりも非効率。 https://learn.microsoft.com/ja-jp/dotnet/core/deploying/nativeaot/?tabs=net8plus#limitations-of-native-aot-deployment 2023/06/01 #dotnetjpcommunities 17
ライブラリ作成者向け AOTと互換していることの表明 <PropertyGroup> <IsAotCompatible>true</IsAotCompatible> </PropertyGroup> IsAotCompatible をtrueにすることでAOTと互換していることを表明し、 同時にプロジェクト内で互換性チェックのAnalyzerが有効になる https://learn.microsoft.com/ja-jp/dotnet/core/deploying/nativeaot/?tabs=net8plus#aot-compatibility-analyzers 2023/06/01 #dotnetjpcommunities 18
AOT警告 例えばジェネリクスメソッド List<T>.Add は AOT時にはList<double>.Addなど 具体的な型に解決する必要がある。 実際に利用される具体的な型が不明な場合 警告される https://learn.microsoft.com/ja-jp/dotnet/core/deploying/native-aot/fixing-warnings https://learn.microsoft.com/ja-jp/dotnet/core/deploying/native-aot/warnings/il3050 2023/06/01 #dotnetjpcommunities 19
NativeAOTの最適化 理論的に最速の実行可能ファイルを生成することと、 実行可能ファイルのサイズのどちらを優先するかコンパイラが判断している。 OptimizationPreference オプションで設定でき、 既定では混合で、実行速度優先(Speed)とサイズ優先(Size)に設定できる。 <OptimizationPreference>Speed</OptimizationPreference> <OptimizationPreference>Size</OptimizationPreference> https://learn.microsoft.com/ja-jp/dotnet/core/deploying/nativeaot/optimizing 2023/06/01 #dotnetjpcommunities 20
参考資料 ネイティブ AOT の ASP.NET Core サポート gRPC とネイティブ AOT worker サービス テンプレートでの AOT チュートリアル: ASP.NET Core アプリをネイティブ AOT を使用して発行する Native AOT deployment 2023/06/01 #dotnetjpcommunities 21
おわり @門司港 22