.NET ネイティブ アプリでのランタイム例外
デバッグ構成とリリース構成は完全に異なるため、ターゲット プラットフォームでユニバーサル Windows プラットフォーム アプリのリリース ビルドをテストすることは重要です。 既定では、デバッグ構成は .NET Core ランタイムを使用してアプリをコンパイルしますが、リリース構成は .NET ネイティブを使用してアプリをネイティブ コードにコンパイルします。
重要
アプリのリリース バージョンをテストするときに発生する可能性のある MissingMetadataException、MissingInteropDataException、および MissingRuntimeArtifactException の例外の処理の詳細については、「Getting Started」(.NET ネイティブの概要) トピックの「手順 4: メタデータの欠落を手動で解決する」、「Reflection and .NET Native」(リフレクションおよび .NET ネイティブ)、「Runtime Directives (rd.xml) Configuration File Reference」(ランタイム ディレクティブ (rd.xml) 構成ファイル リファレンス) を参照してください。
デバッグ ビルドとリリース ビルド
.NET Core ランタイムに対してデバッグ ビルドを実行した場合は、ネイティブ コードにコンパイルされません。 このため、一般にランタイムによって提供されるすべてのサービスをアプリで使用することができます。
一方、リリース ビルドの場合は、パフォーマンスを最大化するために、ターゲット プラットフォーム用のネイティブ コードにコンパイルされ、外部のランタイムおよびライブラリに対する依存関係のほとんどが削除され、コードが大幅に最適化されます。
.NET ネイティブを使用してコンパイルされたリリース ビルドをデバッグする場合:
通常の .NET デバッグ ツールとは異なる、.NET ネイティブのデバッグ エンジンを使用します。
実行可能ファイルのサイズは、最大限削減されます。 .NET ネイティブが実行可能ファイルのサイズを削減する方法の 1 つは、ランタイムの例外メッセージを大幅にトリミングする方法です。これについては、「 Runtime exception messages 」セクションでトピックとして詳細に説明しています。
コードは大幅に最適化されます。 つまり、できる限りインライン展開が使用されます。 (インライン化により、外部ルーチンから呼び出し元ルーチンにコードが移動されます)。.NET ネイティブが特殊なランタイムを提供し、積極的なインライン化を実装するという事実は、デバッグ時に表示される呼び出し履歴に影響します。 詳細については、「 Runtime call stack 」を参照してください。
Note
[.NET ネイティブ ツール チェーンを使用してコンパイルする] ボックスをオンまたはオフにすることによって、デバッグ ビルドとリリース ビルドを .NET ネイティブ ツール チェーンでコンパイルするかどうかを制御できます。 ただし、Microsoft Store では常に、.NET ネイティブ ツール チェーンを使用してアプリの実稼働バージョンをコンパイルします。
Runtime exception messages
アプリケーションの実行可能ファイルのサイズを最小限に抑えるために、.NET ネイティブは例外メッセージの全文を組み込みません。 そのため、リリース ビルドでスローされるランタイム例外では、例外メッセージの全文が表示されない場合があります。 代わりに、部分的な文字列を含むテキストが、詳細を示すリンクと共に表示される可能性があります。 たとえば、以下のような例外情報が表示されます。
Exception thrown: '$16_System.AggregateException' in Unknown Module.
Additional information: AggregateException_ctor_DefaultMessage
If there is a handler for this exception, the program may be safely continued.
完全な例外メッセージが必要な場合は、代わりにデバッグ ビルドを実行します。 たとえば、リリース ビルドからの上記の例外情報は、デバッグ ビルドでは以下のように表示されます。
Exception thrown: 'System.AggregateException' in NativeApp.exe.
Additional information: Value does not fall within the expected range.
Runtime call stack
インライン展開および他の最適化のために、.NET ネイティブ ツール チェーンでコンパイルされたアプリで表示される呼び出し履歴では、ランタイム例外へのパスを明確に識別できない場合があります。
完全なスタックを取得するには、代わりにデバッグ ビルドを実行します。