AOTプロジェクトには特別なテンプレートがあり、現在AOTをサポートするテンプレートにはMini APIとgRPCがあります。Mini APIのAOTプロジェクトにはいくつかの違いがあり、以下は開発に関する違いを簡潔に説明したものです。
-
CreateSlimBuilder()
APIを使用して、デフォルトで基本機能のみを有効にし、アプリのデプロイサイズを最小限に抑えます。 - HTTPのみをリッスンするように設定します。HTTPSトラフィックは通常、クラウドネイティブデプロイメントのエントリーサービスによって処理されます。
- プロジェクトファイルに
PublishAot
を追加します。true。 - JSONシリアライザーのソースジェネレーターを有効にします。ソースジェネレーターは、ビルド時にシリアライズコードを生成するために使用され、ネイティブAOTコンパイルに必要です。
- 動的リフレクションは不可、動的なファイルのロードや動的コンパイルをサポートしない。
- .NETの多くのサードパーティライブラリー、公式のJsonシリアライザーを含む、リフレクションを使用しているため、開発時にはこれらのサポートされないライブラリーの使用を避ける必要があります。
- 簡単な例を挙げると、通常のリフレクションは使用可能です。リフレクションされたクラスが明示的であれば問題ありませんが、型が暗黙のものである場合、例えばジェネリックタイプのリフレクションをすると、結果がnullになります。実際には
type.GetMembers()
を一度呼び出し、コンパイラに型メンバーを残してもらうことで、ジェネリックリフレクションを使用できます。つまり、型の構成を事前に知っておき、後でリフレクション時に使用することができます。この場合、すべての型メンバーを事前に取得することをお勧めしません。むしろ、すべての型メンバーをソースジェネレーターで事前にリソースファイルに抽出し、対応する機能でそのリソースファイルを使用する方が良いです。 - また、
[JsonConverter(typeof(JsonStringEnumConverter))]
を使って列挙型を表記しても効果がありません。[JsonConverter(typeof(JsonStringEnumConverter<Sex>))]
のように性(Sex)を明示的に指定する必要があります。 - もう一つ重要な点は、AOTプロジェクトのデバッグモードの挙動とリリース後の挙動が一致しないことです。上記の2つの点は、VS内で実行すると問題ないのですが、リリース後に実行すると、挙動が一致しないことが分かります。これも一つの問題点ですが、AOTが成熟するにつれて、改善されることを期待しています。
全体として、AOTプロジェクトを開発する際には、一つの機能が完成するたびにリリースして、問題がないかを早期に発見して改善することをお勧めします。第二に、使用するライブラリーについて十分に理解し、これらのライブラリーがAOTを完全にサポートしていることを確認することが重要です。第三に、プロジェクトの信頼性を検証するために性能テストを実施することが必要です。
(Translated by GPT)