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 属性,并删除受限功能声明(但保留功能元素)。 类似于下面这样:

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

<Capabilities/>
...

如果包安装在 Windows 10 版本 2004(10.0;内部版本 19041)及/或更高版本,而不是设置 EntryPoint,则可以设置 uap10:TrustLeveluap10: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 双项目解决方案

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

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

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

Windows 应用程序打包项目意味着替代 Package.appxmanifest 中的配置的默认设置。 此项目的行为就像项目文件中的 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# 编写的桌面应用。

然后打开新的打包项目的项目文件,并将 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 的“属性”窗口(而不是项目属性)中,对于“信任级别”属性,请选择“部分信任”值。