MSIX AppContainer(应用容器)应用

旧版应用程序的 AppContainer 主题涵盖了有关 AppContainer 环境及其优势的所有必要背景信息;该主题还包含 C# 和C++代码示例,用于测试进程是否在 AppContainer 中运行。

现在阅读的主题演示如何采用使用 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) 或更高版本,则可以设置 uap10:TrustLeveluap10:RuntimeBehavior (如图所示,在声明 XML 命名空间前缀后),而不是设置 EntryPoint。 像这样:

<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 双项目解决方案

上一部分介绍了单项目 MSIX 的流程,我们推荐这种方法,它也是新建 WinUI 3 项目的默认选项。 有关详细信息,请参阅 使用单项目 MSIX 打包应用

但你可能有一个 WinUI 3 项目,该项目从引入单项目 MSIX 功能之前开始。 在这种情况下,你的解决方案中有两个项目,即你的应用项目,以及一个额外的 Windows 应用程序打包项目。 如果可以将项目迁移到单项目 MSIX,则这是理想的做法。 你将能够根据上一部分中的指导进行操作。 有关详细信息,请参阅 使用单项目 MSIX 打包应用

如果 无法 将项目迁移到单项目 MSIX,本部分介绍如何将包配置为包含 AppContainer 应用。

Windows 应用程序打包项目表示默认设置会覆盖Package.appxmanifest中的配置。 项目的行为就像项目文件中的 TrustLevel 属性设置为“Full”值一样。

若要修正隐含属性值,请展开打包项目的 Dependencies>Applications 节点,然后选择表示对 WinUI 3 项目的引用的节点。 然后在 Visual Studio 的属性窗口(而不是项目属性)中,对于信任级别属性,选择部分信任的值。

打包项目的项目文件现在包含以下显式属性:

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

现在可以从打包项目的<rescap:Capability Name="runFullTrust" />文件中删除Package.appxmanifest

为 AppContainer 配置 Windows 应用程序项目(C++ Win32 WndProc 类型应用)

如果你有使用 Windows 应用程序项目 项目模板创建的 C++ Win32 WndProc 类型项目,则此部分适用于你。 简言之,第一步是将C++ Windows 应用程序打包项目添加到解决方案。 有关具体步骤的详细信息,请参见在 Visual Studio 中为 MSIX 打包设置桌面应用程序。 本主题适用于以 C++ 或 C# 编写的桌面应用。

然后打开新的打包项目项目文件,并将 TrustLevel 属性添加到现有 ProjectReference 属性,如下所示:

...
<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 窗体应用(.NET Framework)的项目模板。

简言之,第一步是将 C# Windows 应用程序打包项目添加到解决方案中。 有关具体步骤的详细信息,请参见在 Visual Studio 中为 MSIX 打包设置桌面应用程序

然后展开打包项目的 依赖项>应用程序 节点,然后选择表示对 WPF 或 WinForms 项目的引用的节点。 然后在 Visual Studio 的属性窗口(而不是项目属性)中,对于信任级别属性,选择部分信任的值。