.NETとネイティブ AOT を使用して UWP アプリを最新化する

モダン .NET の UWP サポートが一般公開され、Visual Studio 2026 の C# UWP アプリの既定のプロジェクトタイプです。 Visual Studio 2026 には、latest .NET を使用して新しい UWP アプリケーション、クラス ライブラリ、Windows ランタイム コンポーネントを作成するための組み込みのプロジェクト テンプレートが含まれています。

この記事では、UWP アプリのレガシ プリコンパイル テクノロジである .NET Native について説明します。 .NET Native は引き続きセキュリティと信頼性の修正プログラムを受け取りますが、新機能の更新プログラムは受け取りません。 現在 .NET Native を使用している場合、このガイドは、Native AOT を使用して最新の.NETに移行する利点を理解するのに役立ちます。

モダン .NETに最新化する理由

ネイティブ AOT を使用して UWP アプリを .NET Native から latest .NET にアップグレードすると、いくつかの主な利点があります。

モダン .NET機能へのアクセス

  • 最新の .NET と C# の機能: すべての最新の言語機能と API を備えた最新の .NETを使用します
  • Active development: .NET Native は引き続きセキュリティと信頼性の修正プログラムを受け取りますが、新機能の更新プログラムは受け取りません。 最新の.NETは、定期的な機能リリースで積極的に開発されています
  • ライブラリの互換性を向上: .NET 6 以降のみをサポートする新しいバージョンの NuGet パッケージを参照します

開発者エクスペリエンスの向上

  • ビルド時間の短縮: .NET Nativeと比較して、コンパイルが大幅に高速化されます
  • デバッグのサポートの強化: AOT とトリミングの問題に対するデバッグ ツールと診断機能の強化
  • SDK スタイルのプロジェクト ファイル: 詳細なレガシ スタイルの構成を使用せずに、モダンでクリーンな .csproj ファイル
  • XAML ホット リロード: 開発中の XAML と C# ホット リロードの完全なサポート
  • 優れたツール: IntelliSense、Live Preview、XAML 診断がシームレスに機能する

パフォーマンスの利点

  • Native AOT コンパイル: .NET Native と比較して、同等またはより良い起動パフォーマンスを発揮します。
  • 最適化されたランタイム: 手続き型間の最適化によるパフォーマンスの向上
  • 静的検証: アナライザーと注釈を使用してビルド時に AOT の互換性の問題をキャッチする

WinUI 3 への増分移行パス

.NET ランタイムと UI フレームワークの両方を同時に移行するのではなく、増分アプローチを使用できるようになりました。

  1. まず、最新の.NETに移行し、ネイティブ AOT の互換性を検証します
  2. その後、UWP XAML から WinUI 3 と Win32 アプリ モデルに個別に移行します

この 2 段階のアプローチにより、リスクが軽減され、移行の管理が容易になります。

前提条件

最新の.NETを使用して UWP アプリを開発するには、次のものが必要です。

  • Visual Studio 2026
  • ユニバーサル Windows プラットフォーム ツール ワークロード
  • Windows SDK 10.0.26100.0 以降

インストール手順

  1. Visual Studio インストーラーを開く
  2. Workloads>Desktop および MobileWindows アプリケーション開発 ワークロードを選択します
  3. オプション(右ペイン)で、次を選びます。
    • ユニバーサル Windows プラットフォーム ツール - UWP アプリのすべてのツールが含まれています
    • Windows 11 SDK (10.0.26100.0) - UWP XAML アプリをビルドするために必要

モダン .NETを使用して新しい UWP Projectを作成する

Visual Studio 2026 には、最新の.NETを使用した UWP 用のプロジェクト テンプレートがいくつか含まれています。 既定の C# UWP プロジェクト テンプレートは、.NET Nativeではなく最新の.NETをターゲットとするようになりました。

  • 空の UWP アプリ: 単一プロジェクトの MSIX パッケージを使用した標準の UWP XAML アプリケーション
  • 空の UWP CoreApplication アプリ: Composition/DirectX コンテンツを使用する高度なシナリオの場合 (XAML なし)
  • UWP Windows ランタイム コンポーネント: 最新の.NETと CsWinRT を使用したマネージド WinRT コンポーネント
  • UWP クラス ライブラリ: XAML をサポートするクラス ライブラリ

ヒント

従来の .NET Native テンプレート (".NET Native" とマーク) は互換性のために引き続き使用できますが、新しい開発には最新の.NET テンプレートをお勧めします。

新しいProjectを作成する

  1. Visual Studioで、FileNewProject
  2. プロジェクトの種類のドロップダウンで C#UWP でフィルター処理する
  3. 空の UWP アプリ テンプレートを選択する
  4. プロジェクト名を入力し、[作成] を選択します
  5. ターゲットと最小Windowsバージョンを選択する

UWP モダン .NET プロジェクトについて

UWP モダン .NET プロジェクトでは、主なプロパティを含む SDK スタイルの .csproj ファイルが使用されます。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net10.0-windows10.0.26100.0</TargetFramework> <!-- Use the latest supported .NET version -->
    <TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
    <UseUwp>true</UseUwp>
    <EnableMsixTooling>true</EnableMsixTooling>
    <PublishAot>true</PublishAot>
    <DisableRuntimeMarshalling>true</DisableRuntimeMarshalling>
  </PropertyGroup>
</Project>

主なプロパティの説明

  • UseUwp: Windows.UI.Xaml 型の WinRT プロジェクションを参照し、UWP 互換性のために CsWinRT を構成します
  • UseUwpTools: XAML コンパイラ、プロジェクト機能、MSIX パッケージなど、UWP 固有のツールを有効にします。 UseUwpが有効になっている場合、このプロパティは既定で有効になります。
  • EnableMsixTooling: 単一プロジェクトの MSIX サポートを有効にします (個別のパッケージ プロジェクトは必要ありません)
  • PublishAot: ネイティブ AOT コンパイルを有効にする
  • DisableRuntimeMarshalling: ネイティブ AOT シナリオのパフォーマンスを最適化します

既存の UWP アプリをモダン .NETに移行する

既存の UWP アプリを .NET Native からモダン .NETに移行するには:

手順 1: Project ファイルを更新する

  1. 既存の .csproj を SDK スタイルの形式に変換する
  2. 必要なプロパティ (UseUwpEnableMsixTooling、その後、PublishAot または SelfContained)
  3. 最新の.NETと互換性のあるバージョンへの NuGet パッケージ参照を更新する

手順 2: ネイティブ AOT の互換性に対処する

ネイティブ AOT では、すべてのコードが AOT 互換である必要があります。 一般的な問題は次のとおりです。

  • リフレクションの使用法: 適切な属性を追加するか、ソース ジェネレーターを使用する
  • 動的なコード生成: コンパイル時の代替手段に置き換える
  • サード パーティ製ライブラリ: すべての依存関係でネイティブ AOT がサポートされていることを確認する

AOT の互換性の詳細については、以下を参照してください。

アプリケーション コード プロジェクト:

<PropertyGroup>
  <PublishAot>true</PublishAot>
</PropertyGroup>

ライブラリ プロジェクトでは、次の設定を行うことができます。

<PropertyGroup>
  <IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>

既存のアプリで .NET Native に対して runtime ディレクティブ (rd.xml) ファイル を使用している場合は、代わりに属性とアナライザーを使用してネイティブ AOT でリフレクションとトリミングの要件に異なる方法で対処する必要があります。

ヒント

XAML で[GeneratedBindableCustomProperty]が必要なクラスで{Binding}を使用します。 これらのクラスは、 partialとしてマークする必要があります。

手順 3: 徹底的にテストする

  1. ネイティブ AOT を有効にしてリリース モードでアプリをビルドする
  2. すべての機能をテストする - AOT コンパイル コードは、適切に注釈が付けられたときにデバッグ ビルドと同じように動作します
  3. 発行する前にトリミングまたは AOT の警告を解決する

ネイティブ AOT の互換性の詳細については、「AOT 警告の概要およびトリミング用のprepare .NET ライブラリを参照してください。

ネイティブ AOT と .NET Native

両方ともアプリをネイティブ コードにコンパイルしますが、Native AOT は重要な点で .NET Native とは異なります。

静的検証

  • ネイティブ AOT: コード注釈とアナライザーを使用して静的分析を使用して、ビルド時に AOT の互換性を検証します
  • .NET Native: デバッグが困難なランタイム クラッシュにつながる可能性があるヒューリスティックとフォールバック ロジックを使用します

パフォーマンスとサイズ

  • スタートアップ パフォーマンス: ネイティブ AOT は、同様またはより優れたスタートアップ パフォーマンスを提供します (ベンチマークで最大 5% 改善)
  • バイナリ サイズ: 自己完結型のデプロイ (共有フレームワーク パッケージなし) により、小規模なアプリでは約 4 MB の増加が予想されます
  • ランタイム パフォーマンス: 手続き型間の最適化によるバックエンド コードのパフォーマンスの向上

開発者エクスペリエンス

  • ネイティブ AOT: 明確なエラー メッセージとデバッグ のサポートにより、開発中に問題が発生する
  • .NET Native: ビルド時間が遅い、デバッグとリリースの違い、および実行時の問題の診断が困難です

リフレクションとメタデータ

  • ネイティブ AOT: [DynamicallyAccessedMembers] やソース ジェネレーターなどのコンパイル時属性を使用してリフレクションを処理します
  • .NET Native: runtime ディレクティブ (rd.xml) ファイルを使用して、ビルド時のメタデータ要件を指定します

.NETネイティブの制限の詳細については、「 .NET Native>.NET Native and Compilation」を参照してください。

Microsoft Storeへの発行

最新の.NETを使用して UWP アプリをMicrosoft Storeに発行する場合:

  1. PublishAotまたはSelfContainedを有効にしてリリース構成でビルドする
  2. AOT またはトリミングの警告がないことを確認する
  3. 通常どおり MSIX パッケージを作成する
  4. パートナー センターへのアップロード

"サポートされていない Win32 API" に関連する Windows アプリ 認定キット (WACK) のエラーは無視できます。パートナー センターでは、UWP アプリに対して厳密な Win32 API 検証が実行されなくなりました。 AppContainer セキュリティは、代わりにランタイムのアクセス許可を処理します。

高度なシナリオ

UWP XAML アイランズ

最新の.NETでは、Win32 アプリ (WinForms、WPF、WinUI 3) 内で UWP XAML コントロールをホストできます。 これにより、次のことが可能になります。

  • 完全信頼パッケージ アプリでの MapControl などの UWP コントロールのホスト
  • Win32 アプリと UWP コンポーネントを組み合わせた単一プロジェクト ソリューション
  • 個別のビルド ツールチェーンを使用しない単一のネイティブ バイナリ

最新の NuGet パッケージの使用

最新の.NETサポートを使用すると、.NET 6 以降を必要とする最新の NuGet パッケージを参照できます。これにより、.NET Native の .NET Standard 2.0 制約の制限が解除されます。

その他のリソース

こちらもご覧ください

.NET ネイティブ ドキュメント (レガシ)

移行リソース