通过


MSIX AppContainer(应用容器)应用

重要

对于在 AppContainer 中运行的任何进程,如果导致调用 DeploymentManager.Initialize,则应用需要在packageManagement中声明受限功能。 有关详细信息,请参阅 部署管理器自动初始化器

旧版应用程序的 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)及更高版本上,那么可以在声明 XML 命名空间前缀后,如下所示,设置 uap10:TrustLeveluap10:RuntimeBehavior,而不是设置 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 的 Properties 窗口(而不是项目属性)中,为 Trust Level 属性选择 Partial Trust 的值。

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

...
<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 项目

如果有以下任一项,则本部分适用于你:

  • Windows Presentation Foundation(WPF)使用 C# WPF Application 项目模板创建的应用项目。 这将为你提供一个.NET项目;它不同于名为 WPF App (.NET Framework)。 或
  • Windows 窗体 (WinForms) 使用 C# Windows 窗体 App 项目模板创建的应用项目。 这将为你提供一个.NET项目;它与名为 Windows 窗体 App(.NET Framework)

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

然后展开打包项目的 Dependencies>Applications 节点,然后选择表示对 WPF 或 WinForms 项目的引用的节点。 然后在 Visual Studio 的 Properties 窗口(而不是项目属性)中,为 Trust Level 属性选择 Partial Trust 的值。