.NET ネイティブの概要

新しい UWP アプリを作成する場合でも、既存の Windows 8.x アプリ (以前は Microsoft Store アプリとも呼ばれる) を移行する場合でも、同じ一連の手順を行うことができます。 .NET ネイティブ アプリを作成するには、次の手順を実行します。

  1. ユニバーサル Windows プラットフォーム (UWP) ストア アプリを開発し、アプリのデバッグ ビルドをテストして、そのアプリが適切に動作することを確実にします。

  2. 追加のリフレクションおよびシリアル化の使用を処理します。

  3. リリース ビルドのアプリを展開して、テストします

  4. メタデータの欠落を手動で解決し、すべての問題が解決されるまで 手順 3 を繰り返します。

注意

既存の Windows 8.x アプリを .NET Native に移行する場合は、「Windows 8.x アプリの .NET Native への移行」を必ずレビューしてください。

手順 1: UWP アプリのデバッグ ビルドを開発してテストする

新しいアプリを開発するか既存のアプリを移行するかに関係なく、Windows アプリについては同じ手順を実行します。

  1. Visual C# または Visual Basic のユニバーサル Windows アプリ テンプレートを使用して、Visual Studio で新しい UWP プロジェクトを作成します。 既定では、すべての UWP アプリケーションは CoreCLR を対象としていて、.NET ネイティブ ツール チェーンを使用してリリース ビルドがコンパイルされます。

  2. UWP アプリ プロジェクトのコンパイルに .NET ネイティブ ツール チェーンを使用する場合と使用しない場合では、両者の間に既知の互換性問題がある点にご注意ください。 詳細については、 移行ガイド を参照してください。

これで、.NET ネイティブ サーフェス領域に対してローカル システム (またはシミュレーター) で実行される C# または Visual Basic コードを作成できるようになりました。

重要

アプリを開発するときに、コードでのシリアル化またはリフレクションを使用する場合は注意してください。

既定では、デバッグ ビルドは F5 キーを押した時に迅速なデプロイを有効にするために JIT でコンパイルされますが、リリース ビルドは .NET ネイティブ プリコンパイル テクノロジを使用してコンパイルされます。 つまり、アプリのデバッグ ビルドが正常に動作するようにするには、.NET ネイティブ ツール チェーンでコンパイルする前に、これをビルドしてテストする必要があるということです。

手順 2: 追加のリフレクションおよびシリアル化の使用を処理する

プロジェクト作成時に Default.rd.xml という名前のランタイム ディレクティブ ファイルがプロジェクトに自動的に追加されます。 C# で開発する場合、このファイルはプロジェクトの Properties フォルダーにあります。 Visual Basic で開発する場合、このファイルはプロジェクトの My Project フォルダーにあります。

注意

ランタイム ディレクティブ ファイルが必要となる理由の背景を含む .NET ネイティブのコンパイルの概要については、「 .NET ネイティブとコンパイル」をご覧ください。

ランタイム ディレクティブ ファイルは、アプリの実行時に必要なメタデータを定義するために使用されます。 この既定バージョンのファイルで十分な場合もあります。 ただし、シリアル化やリフレクションに依存するコードには、ランタイム ディレクティブ ファイルに追加のエントリが必要になるものがあります。

シリアル化

シリアライザーには 2 つのカテゴリがあり、これらはいずれもランタイム ディレクティブ ファイルに追加エントリを必要とする場合があります。

  • 非リフレクション ベースのシリアライザー。 DataContractSerializerDataContractJsonSerializer、および XmlSerializer クラスなど、.NET Framework クラス ライブラリ内にあるシリアライザーは、リフレクションに依存しません。 ただし、これらのシリアライザーでは、シリアル化または逆シリアル化されるオブジェクトに基づいてコードが生成される必要があります。 詳しくは、「 シリアル化とメタデータ」の「Microsoft のシリアライザー」セクションをご覧ください。

  • サードパーティ シリアライザー。 サードパーティのシリアライズ化ライブラリ (Newtonsoft の JSON シリアライザーが最も一般的) は、通常はリフレクション ベースであり、オブジェクトのシリアル化と逆シリアル化をサポートするために *.rd.xml ファイル内のエントリを必要とします。 詳しくは、「 Serialization and Metadata」の「サードパーティ シリアライザー」セクションをご覧ください。

リフレクションに依存するメソッド

コードでのリフレクションの使用は明確ではない場合があります。 一般的な API やプログラミング パターンの中には、リフレクション API の一部とは見なされないが、正常な実行にリフレクションを必要とするものがあります。 これには、次のような型インスタンス化およびメソッド作成方法があります。

詳細については、「 リフレクションに依存する API」を参照してください。

注意

ランタイム ディレクティブ ファイルで使用される型名は完全修飾である必要があります。 たとえば、ファイルでは "String" ではなく "System.String" を指定する必要があります。

手順 3: リリース ビルドのアプリを展開してテストする

ランタイム ディレクティブ ファイルを更新したら、アプリのリリース ビルドを再ビルドして配置できます。 .NET Native バイナリは、プロジェクトの [プロパティ] ダイアログ ボックスの [コンパイル] タブにある [ビルド出力パス] テキスト ボックスに指定されているディレクトリの ILC.out サブディレクトリに配置されています。このフォルダーにないバイナリは、.NET Native でコンパイルされていません。 ターゲット プラットフォームごとに、アプリを十分にテストし、失敗シナリオを含むすべてのシナリオをテストします。

アプリが正常に動作しない場合 (特に実行時に MissingMetadataException または MissingInteropDataException の例外をスローする場合)、次のセクション「手順 4: メタデータの欠落を手動で解決する」の手順を行ってください。 初回例外を有効にすると、このようなバグの検出に役立ちます。

アプリのデバッグ ビルドをテストしてデバッグし、MissingMetadataExceptionMissingInteropDataException の例外を確実に排除したら、アプリを最適化された .NET Native アプリとしてテストする必要があります。 これを行うには、アクティブ プロジェクトの構成を [デバッグ] から [リリース]に変更します。

手順 4: メタデータの欠落を手動で解決する

デスクトップでは発生せず、.NET ネイティブで発生する最も一般的な失敗は、MissingMetadataExceptionMissingInteropDataException、または MissingRuntimeArtifactException のランタイム例外です。 メタデータの欠落は、予期しない動作やアプリの失敗によって判明することもあります。 このセクションでは、ランタイム ディレクティブ ファイルにディレクティブを追加することによって、これらの例外をデバッグして解決する方法を説明します。 ランタイム ディレクティブの形式については、「ランタイム ディレクティブ (rd.xml) 構成ファイル リファレンス」を参照してださい。 ランタイム ディレクティブを追加したら、もう一度アプリを配置およびテストして、例外が発生しなくなるまで新しい MissingMetadataExceptionMissingInteropDataExceptionMissingRuntimeArtifactException の例外を解決する必要があります。

ヒント

高いレベルでランタイム ディレクティブを指定して、アプリがコードの変更に対応できるようにします。 メンバー レベルではなく、名前空間レベルおよび型レベルでランタイム ディレクティブを追加することをお勧めします。 回復性と、バイナリを大きくすることに伴うコンパイル時間の延長の間にはトレードオフがある場合があることに注意してください。

メタデータの欠落例外に対応する場合は、次のことを確認してください。

  • 例外が発生する前にアプリが何を実行しようとしていたか。

    • たとえば、データ バインド、シリアル化または逆シリアル化を行っていたか、またはリフレクション API を直接使用していましたか。
  • これは特殊なケースか、または他の型でも同じ問題が発生すると考えられるか。

    • たとえば、MissingMetadataException 例外は、アプリのオブジェクト モデル内の型をシリアル化するときにスローされます。 シリアル化されるその他の型がわかっている場合は、それらの型 (または、コードがどの程度構造的に作成されているかによって、それを含む名前空間) に同時にランタイム ディレクティブを追加できます。
  • リフレクションを使用しないようにコードを書き換えることができるか。

    • たとえば、予期される型がわかっている場合に、コードで dynamic キーワードが使用されていますか。

    • より適切な他の方法を使用できる場合に、リフレクションに依存するメソッドをコードで呼び出していますか。

注意

デスクトップ アプリと .NET ネイティブでのリフレクションとメタデータの可用性の違いから発生する問題の処理の詳細については、「リフレクションに依存する API」を参照してください。

アプリのテスト時に発生する例外およびその他の問題の処理に関する具体的な例については、次のページを参照してください。

関連項目