【要約】【C#】.NET 10の「ファイルベース実行」で、dotnet runしただけなのにAOTエラーでクラッシュする原因と対策 [Qiita_Trend] | Summary by TechDistill
> Source: Qiita_Trend
Execute Primary Source
// Problem
開発者が.NET 10でC#ファイルを直接
dotnet run した際、予期せぬランタイムエラーに直面する。従来のJIT実行を想定したコードが、実行時にクラッシュする問題である。- ・現象:
System.Text.Json等のリフレクションを利用する処理がSystem.InvalidOperationExceptionで失敗する。 - ・原因: ファイルベースのアプリ仕様により、デフォルトで
PublishAot=trueが適用されるためである。 - ・矛盾: JIT実行モードであっても、AOT制限フラグが立ち、動的コード生成が禁止される。
// Approach
開発者は、用途に応じて「AOT制限の解除」または「AOT準拠への移行」のいずれかを選択して問題を解決する。
- ファイル冒頭に
- ・対策1: AOT制限を明示的に無効化する(推奨)。
--property PublishAot=false 引数を付与する。- ファイル冒頭に
#:property PublishAot=false を記述する。- ・対策2: コードをAOT互換に書き換える。
// Result
開発者は、スクリプト実行の利便性を維持しつつ、.NET 10の新しい仕様による制約を回避できる。用途に応じた適切な設定により、以下の効果が得られる。
- ・CI/CD環境: 引数指定により、既存のロジックを修正せず安全に自動化スクリプトを動作させられる。
- ・開発体験: 意図しないAOTエラーによるデバッグコストを削減し、迅速なプロトタイピングが可能になる。
Senior Engineer Insight
> この仕様変更は、スクリプトの「手軽さ」と「AOTによる最適化」のトレードオフを強いるものである。CI/CD等の自動化プロセスにおいて、従来のJIT挙動を期待すると、本件のような破壊的挙動に遭遇するリスクがある。現場では、スクリプトの用途が「単なる自動化」か「高パフォーマンスな実行体」かを明確にし、プロパティ設定を明示的に管理すべきだ。