MSIX AppContainer アプリ

レガシ アプリケーションの 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属性を編集し、制限された機能宣言を削除できます(ただし、機能要素は保持します)。 例:

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

<Capabilities/>
...

パッケージが Windows 10、バージョン 2004 (10.0;ビルド 19041)以降のバージョンにインストールする場合、「EntryPoint」を設定する代わりに、「uap10:TrustLevel」と「uap10:RuntimeBehavior」を設定できます(表示されているように、XML 名前空間接頭辞を宣言した後)。 例:

<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 プロジェクトを持っている場合があります。 その場合、ソリューションには、アプリ プロジェクトと追加の Windows アプリケーション パッケージ プロジェクトという 2 つのプロジェクトがあります。 プロジェクトを単一プロジェクト MSIX に移行できれば理想的です。 また、前のセクションのガイダンスに従えるようになります。 詳細については、「単一プロジェクト MSIX を使用してアプリのパッケージ化」を参照してください。

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

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

この暗黙的なプロパティ値を修正するには、パッケージ プロジェクトの"依存関係>アプリケーション"ノードを展開し、WinUI 3 プロジェクトへの参照を表すノードを選択します。 次に、Visual Studio のプロパティ ウィンドウ (プロジェクトのプロパティではなく) で、信頼レベル プロパティに部分的な信頼の値を選択します。

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

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

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

AppContainer 用に Windows アプリケーション プロジェクト (C++ Win32 WndProc 型アプリ) の構成

このセクションは、Windows アプリケーション プロジェクトプロジェクト テンプレートで作成された C++ Win32 WndProc 型プロジェクトをお持ちの場合に使用します。 簡単に説明すると、最初の手順ではソリューションに C++ Windows アプリケーション パッケージ プロジェクトを追加することです。 正確な手順の詳細については、「Visual Studio で MSIX パッケージ用にデスクトップ アプリケーションの設定」を参照してください。 このトピックは、C++ または C# で記述されたデスクトップ アプリに適用されます。

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

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

構築時に、"エラー 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 アプリ (.NET Framework)という名前のプロジェクト テンプレートとは異なります。 または
  • C# Windows フォーム アプリプロジェクト テンプレートで作成された Windows フォーム (WinForms) アプリ プロジェクト。 これで.NET プロジェクトが作成されます。Windows フォーム App (.NET Framework) という名前のプロジェクト テンプレートとは異なります。

簡単に説明すると、最初の手順ではソリューションに C# Windows アプリケーション パッケージ プロジェクトを追加することです。 正確な手順の詳細については、「Visual Studio で MSIX パッケージ用にデスクトップ アプリケーションの設定」を参照してください。

次に、パッケージ プロジェクトの依存関係>アプリケーションノードを展開し、WPF または WinForms プロジェクトへの参照を表すノードを選択します。 次に、Visual Studio のプロパティ ウィンドウ (プロジェクトのプロパティではなく) で、信頼レベル プロパティに部分的な信頼の値を選択します。