パッケージ化されていない WinUI 3 アプリを配布する

パッケージ化されていない配布を使用すると、MSIX を使用せずに WinUI 3 アプリを配布できます。MSIX 展開が利用できないエンタープライズ シナリオや、従来のフォルダーベースのインストールを好む開発者に便利です。

Important

開始する前に、これらの制限事項を確認してください。 パッケージ化されていない WinUI 3 アプリには、配布戦略に影響する制約があります。

  • 単一ファイル EXE — パッケージ化されていない自己完結型 WinUI 3 アプリは、PublishSingleFile (Windows アプリ SDK 1.5 以降) をサポートします。 これにより、1 つの再頒布可能 EXE が生成されます。依存関係は、最初の起動時に一時ディレクトリに抽出されます。 特定の MSBuild プロパティが必要です。以下 の単一ファイル EXE を参照してください。 フレームワークに依存するアプリとパッケージ アプリは、 PublishSingleFileをサポートしていません。
  • Runtime 依存関係 — Windows アプリ SDK ランタイムがユーザーのコンピューターに存在している必要があります。 ランタイム インストーラーをアプリにバンドルするか、自己完結型のデプロイを使用する必要があります (出力サイズが大幅に増加します)。 以下の「 Windows アプリ SDK ランタイムのデプロイを参照してください。
  • パッケージ ID なし — パッケージ マニフェストがない場合、アプリはマニフェスト ベースのWindows機能を使用できません。アプリ インストーラーまたはストアによる自動更新、バックグラウンド タスクの登録、パッケージ マニフェストによるファイルの種類の関連付けやスタート メニュー タイルのカスタマイズはありません。 (インストーラーによって記述されたレジストリ エントリやショートカットなどの従来の Win32 メカニズムは引き続き機能します)。
  • MSIX/パッケージID無しの Store 提出 — この配布モデルにはパッケージIDがないため、Microsoft Store への MSIX 提出対象外です。 ( MSI または EXE インストーラーの申請パスを使用して、従来のインストーラーをストアに送信できますが、これはこの記事で説明するワークフローとは別のワークフローです)。

これらの制約が懸念される場合は、完全な MSIX 変換を行わずにパッケージ ID を追加するために、 アプリのパッケージ 化 (ほとんどのアプリに推奨) または 外部の場所でのパッケージ化 を検討してください。

すべてのパッケージ化オプションの詳細については、「Windows アプリのパッケージ化と展開の概要」を参照してください。

新規または既存の WinUI アプリのパッケージ化を解除する場合は、次の手順に従います。

.csproj ファイルで、最初の既存の PropertyGroup 要素を見つけます。この要素には、OutputTypeTargetFramework、その他のプロパティも含まれています。

  • WindowsPackageType project プロパティをこの PropertyGroup 要素に追加します。 その値を Noneに設定します。
<Project ...>
  ...
  <PropertyGroup>
    <WindowsPackageType>None</WindowsPackageType><!-- add this -->
    <OutputType>WinExe</OutputType>
    <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
    ...
  </PropertyGroup> 
  ...
</Project>

Visual Studio (Debugging または Without Debugging )、Unpackaged 起動プロファイルを Start ドロップダウンから選択します。 Package プロファイルが選択されている場合は、Visual Studioに展開エラーが表示されます。 この手順は、コマンド ラインまたはエクスプローラーからアプリケーション (.exe) Windows起動する場合は必要ありません。

Visual Studio - C# アプリケーションのパッケージ化されていない起動プロファイルが強調表示された状態でドロップダウンを開始します

ブートストラッパー API

<WindowsPackageType>None</WindowsPackageType> プロジェクト プロパティを設定すると、auto-initializer は、アプリに最適なバージョンのWindows アプリ SDKを検索して読み込みます。

高度なニーズ (カスタム エラー処理、特定のバージョンのWindows アプリ SDKの読み込みなど) がある場合は、代わりにブートストラップ API を明示的に呼び出すことができます。 詳細については、「外部の場所でパッケージ化されたアプリまたはパッケージ化されていないアプリのWindows アプリ SDKランタイムを使用する」および「Tutorial: Windows アプリ SDKを利用する外部の場所でパッケージ化されたアプリまたはパッケージ化されていないアプリでブートストラップAPIを使用する方法」を参照してください。

ブートストラップの詳細については、 フレームワークに依存するアプリの展開アーキテクチャと概要に関するページを参照してください。

Windows アプリ SDK ランタイムのデプロイ

パッケージ化されていない WinUI 3 アプリは、ユーザーのコンピューターにインストールされているWindows アプリ SDK ランタイムによって異なります。 ランタイムが存在することを確認するには、次の 2 つのオプションがあります。

Option 1: Windows アプリ SDK ランタイム インストーラー (.exe) (推奨)

Windows アプリ SDK ランタイム インストーラーをアプリと共に含めます。 ランタイム インストーラーは、必要なWindows アプリ SDKランタイム パッケージをインストールする再頒布可能.exeです。 Windows アプリ SDK リリース ページ独自のインストーラーまたはセットアップ スクリプトとバンドルします。 完全なガイダンスについては、「パッケージ化されていないアプリまたは外部の場所にあるアプリのためのWindows アプリ SDKランタイムの使用方法を参照してください。

ユーザーはランタイム インストーラーを 1 回実行する必要があります。 後続のアプリの更新では、必要なWindows アプリ SDKバージョンが変更されない限り、ランタイムの再インストールは必要ありません。

オプション 2: 自己完結型のデプロイ

プロジェクト ファイル<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>を設定して、Windows アプリ SDK ランタイムをアプリの出力フォルダーに直接バンドルします。 これにより、ランタイムの依存関係が削除されます。ユーザーは個別に何もインストールする必要はありません。

<PropertyGroup>
  <WindowsPackageType>None</WindowsPackageType>
  <WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
</PropertyGroup>

トレードオフ: 出力フォルダーが大幅に大きくなり (完全なランタイムが含まれています)、各アプリの更新には完全なランタイム ペイロードが含まれます。 このオプションは、単純な配布シナリオや、ターゲット コンピューターにインストールされる内容を制御できない場合に使用します。

Windows アプリ SDK を使用するパッケージ化されていないアプリをデプロイして、完全なランタイム デプロイ リファレンスを作成します。

単一ファイル EXE

Windows アプリ SDK 1.5 以降、パッケージ化されていない自己完結型 WinUI 3 アプリでは、.NET PublishSingleFileデプロイ モデルがサポートされます。 これにより、1 つの再頒布可能な EXE ファイルが生成されます。すべての依存関係は EXE にバンドルされ、初回起動時に一時ディレクトリに抽出されます。

Important

PublishSingleFile は、パッケージ アプリ (MSIX または外部の場所でパッケージ化) またはフレームワークに依存するアプリではサポート されていません 。 パッケージ化されていない状態 自己完結型の両方の条件が必要です。

必要な MSBuild プロパティ

Windows アプリ SDKには、PublishSingleFileが設定されたときにプロジェクトの構成をチェックするビルド時検証ターゲット (WindowsAppSDKSingleFileVerifyConfiguration) が含まれています。 次のプロパティは必須です。

<PropertyGroup>
  <WindowsPackageType>None</WindowsPackageType>
  <WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
  <SelfContained>true</SelfContained>
  <EnableMsixTooling>true</EnableMsixTooling>
  <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
  <PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>

ビルドは、EnableMsixToolingWindowsPackageType=None、またはIncludeAllContentForSelfExtractが見つからない場合はエラーを出力し、WindowsAppSDKSelfContainedまたはSelfContainedがない場合は警告を出力します。

Note

抽出動作:IncludeAllContentForSelfExtract=true は、最初の起動時にユーザーのマシン上の一時ディレクトリに依存関係が抽出されていることを意味します。アプリはゼロ抽出バイナリではありません。 1 つの EXE は配布に便利ですが、実行するには抽出されたファイルが存在する必要があります。 WindowsAppSdkUndockedRegFreeWinRTInitialize自動初期化子は、抽出されたランタイムの検索を処理します。これをオプトアウトする場合は、MICROSOFT_WINDOWSAPPRUNTIME_BASE_DIRECTORY環境変数をプログラムのエントリの前にAppContext.BaseDirectoryに設定する必要があります。

単一ファイルの抽出が許容できない場合の代替手段

ゼロ抽出の単一バイナリが必要な場合、または展開環境で抽出動作が許容されない場合は、次の点を考慮してください。

  • MSIX パッケージ化を使用する - ユーザーは 1 つのインストーラー エクスペリエンスを取得し (アプリ インストーラーはすべてのファイルを処理します)、ストアの適格性、パッケージ ID、および組み込みの更新プログラムを取得します
  • 従来のインストーラー (WiX、Inno Setup) を使用 する - 必要なすべてのファイルを透過的に抽出してインストールする単一の EXE インストーラーで出力フォルダーをラップします
  • 別のフレームワークを使用する - WPFアプリと WinForms アプリは、より広範な構成セットでPublishSingleFileをサポートします

パッケージ化されていないアプリの配布に関する考慮事項

パッケージ化されていない WinUI 3 アプリにはパッケージ ID がないため、特定のWindows機能にアクセスできないことを意味します。

  • App Installer または Windows Store を使用した自動更新なし
  • パッケージ マニフェストを使用してバックグラウンド タスクを登録しない
  • パッケージ マニフェストを使用してファイルの種類の関連付けやプロトコル ハンドラーを使用しない
  • パッケージ マニフェストを使用したスタート メニュー タイルのカスタマイズなし

これらの機能が必要な場合は、完全な MSIX 変換を必要とせずにパッケージ ID を追加する中間パスとして 、外部の場所 でパッケージ化することを検討してください。

最初の Windows アプリを公開することで、WinUI 3 およびその他の Windows アプリ フレームワークの配布オプションの完全な概要を得ることができます。