MSIX AppContainer アプリ

Important

AppContainer で実行されているプロセスで DeploymentManager.Initialize を呼び出す場合は、アプリでpackageManagement制限された機能を宣言する必要があります。 詳細については、「 Deployment Manager の自動初期化子」を参照してください。

従来の アプリケーションの AppContainer のトピックでは、AppContainer 環境とその利点に関する必要なすべての背景情報について説明します。このトピックには、プロセスが AppContainer 内で実行されているかどうかをテストするための C# と C++ のコード例も含まれています。

ここで読んでいるトピックでは、MSIX を使用してパッケージ化されたアプリを取得し、AppContainer 環境 (軽量アプリ コンテナー内) で実行するように簡単に構成する方法を示します。 ユニバーサル Windows プラットフォーム (UWP)アプリは自動的に AppContainer アプリになります。 ただし、MSIX と共にパッケージ化されたデスクトップ アプリを AppContainer アプリとして構成することもできます。

AppContainer アプリのプロセスとその子プロセスは、軽量のアプリ コンテナー内で実行されます。このコンテナーは、それらに対して明示的に付与されたリソースにのみアクセスできます。 また、ファイル システムとレジストリの仮想化を使用して分離されています。 その結果、AppContainer に実装されたアプリをハッキングして、割り当てられた限られたリソースの外部で悪意のあるアクションを許可することはできません。

ヒント

パッケージ化されていないアプリは、AppContainer でも実行できます。 ただし、MSIX を使用してパッケージ化する場合は、AppContainer を使用するのは特に簡単です。 そのため、このトピックで説明するシナリオはすべて、パッケージ アプリに関するシナリオです。

AppContainer 用に WinUI 3 プロジェクトを構成する

「パッケージ化された C# または C++ WinUI 3 デスクトップ アプリの新しいプロジェクトを作成する」の手順では、新しい WinUI 3 プロジェクトを作成するための既定の推奨される方法が示されています。

既定では、プロジェクトの Package.appxmanifest ファイルには、完全信頼 (つまり、中程度の整合性レベル) パッケージの構成が含まれています。 関連するセクションは次のようになります。

...
<Applications>
  <Application ...
    EntryPoint="$targetentrypoint$">
    ...
  </Application>
</Applications>

<Capabilities>
  <rescap:Capability Name="runFullTrust" />
</Capabilities>
...

AppContainer アプリを含むパッケージとしてパッケージを構成するには、 EntryPoint 属性を編集し、制限された機能宣言を削除します ( ただし、Capabilities 要素は保持します)。 このように:

...
<Applications>
  <Application ...
    EntryPoint="windows.partialTrustApplication">
    ...
  </Application>
</Applications>

<Capabilities/>
...

パッケージが Windows 10 バージョン 2004 (10.0;ビルド 19041) 以降にインストールされる場合、EntryPoint を設定する代わりに、(以下に示すように XML 名前空間プレフィックスを宣言した後で) uap10:TrustLeveluap10:RuntimeBehavior を設定することができます。 このように:

<Package ...
  xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10"
  ...>
...
  <Applications>
    <Application ...
      EntryPoint="$targetentrypoint$"
      uap10:TrustLevel="appContainer"
      uap10:RuntimeBehavior="packagedClassicApp">
      ...
    </Application>
  </Applications>

  <Capabilities/>
...

詳細については、次のトピックを参照してください。

AppContainer 用に WinUI 3 2 プロジェクト ソリューションを構成する

前のセクションでは、単一プロジェクト MSIX のプロセスについて説明しましたが、これは推奨されており、新しい WinUI 3 プロジェクトの既定値です。 詳細については、「 単一プロジェクト MSIX を使用してアプリをパッケージ化する」を参照してください。

ただし、単一プロジェクトの MSIX 機能が導入される前の WinUI 3 プロジェクトがある場合があります。 その場合、ソリューションには 2 つのプロジェクト、つまりアプリのプロジェクトと、追加のWindows アプリケーション パッケージング プロジェクトがあります。 プロジェクトを単一プロジェクトの MSIX に移行できる場合は、それが理想的です。 また、前のセクションのガイダンスに従うことができるようになります。 詳細については、「 単一プロジェクト MSIX を使用してアプリをパッケージ化する」を参照してください。

プロジェクトを単一プロジェクトの MSIX に移行 できない 場合、このセクションでは、AppContainer アプリを含むパッケージを構成する方法について説明します。

Windows アプリケーション パッケージ Project は、Package.appxmanifest の構成をオーバーライドする既定の設定を意味します。 プロジェクトは、プロジェクト ファイルに値 Full に設定された TrustLevel プロパティがあるかのように動作します。

暗黙的なプロパティ値を修正するには、パッケージ 化プロジェクトの Dependencies>Applications ノードを展開し、WinUI 3 プロジェクトへの参照を表すノードを選択します。 次に、Visual Studioの Properties ウィンドウ (プロジェクト プロパティではなく) で、Trust Level プロパティに対して、Partial Trust の値を選択します。

パッケージ 化プロジェクトのプロジェクト ファイルに、次の明示的なプロパティが含まれるようになりました。

...
<ItemGroup>
  <ProjectReference Include="...">
    <TrustLevel>Partial</TrustLevel>
  </ProjectReference>
</ItemGroup>
...

パッケージ プロジェクトの<rescap:Capability Name="runFullTrust" /> ファイルからPackage.appxmanifestを削除できるようになりました。

AppContainer 用の Windows アプリケーション Project (C++ Win32 WndProc 型アプリ) を構成する

このセクションは、Windows Application Project project テンプレートで作成された C++ Win32 WndProc 型projectがある場合に適しています。 簡単に言うと、最初の手順は、ソリューションに C++ Windows アプリケーション パッケージ Projectを追加することです。 Visual Studio で MSIX パッケージ化用のデスクトップ アプリケーションをセットアップする手順の詳細については 参照してください。 このトピックは、C++ または C# で記述されたデスクトップ アプリに適用されます。

次に、新しいパッケージ プロジェクトのプロジェクト ファイルを開き、次のように既存の ProjectReference プロパティに TrustLevel プロパティを追加します。

...
<ItemGroup>
  <ProjectReference Include="...">
    <TrustLevel>Partial</TrustLevel>
  </ProjectReference>
</ItemGroup>
...

ビルドすると、"error APPX1673: App manifest is missing required element 'PhoneIdentity'" (エラー APPX1673: アプリ マニフェストに必須要素 'PhoneIdentity' がありません) というエラーが表示されることがあります。 その場合は、次のようにプロジェクトの Package.appxmanifest ファイルを編集します。

<Package ...
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  ...>
...
  <mp:PhoneIdentity
      PhoneProductId="A GUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx."
      PhonePublisherId="A GUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.">
  </mp:PhoneIdentity>
...

AppContainer のWPFまたは WinForms プロジェクトを構成する

このセクションは、次のいずれかの場合に適しています。

  • C# WPF アプリケーション プロジェクト テンプレートを使用して作成された Windows Presentation Foundation (WPF) アプリ プロジェクト。 これで.NETプロジェクトが得られ、WPF App (.NET Framework) という名前のプロジェクト テンプレートとは異なります>。 または
  • C# Windows フォーム App プロジェクト テンプレートを使用して作成された Windows フォーム (WinForms) アプリ プロジェクト。 これで.NETプロジェクトが得られ、Windows フォーム App (.NET Framework) という名前のプロジェクト テンプレートとは異なります。

簡単に言うと、最初の手順は、C# Windows アプリケーション パッケージ Project をソリューションに追加することです。 Visual Studio での MSIX パッケージ化用デスクトップ アプリケーションのセットアップガイドには、正確な手順に関する詳細が記載されています。

次に、パッケージ 化プロジェクトの Dependencies>Applications ノードを展開し、WPF または WinForms プロジェクトへの参照を表すノードを選択します。 次に、Visual Studioの Properties ウィンドウ (プロジェクト プロパティではなく) で、Trust Level プロパティに対して、Partial Trust の値を選択します。