Visual Studio 如何生成应用包清单

使用 Visual Studio 生成项目时,Visual Studio 会 (AppxManifest.xml) 生成包清单,其中包含系统部署、显示或更新通用 Windows 平台 UWP (应用程序所需的信息。

如果使用 Visual Studio 开发应用程序,则会遇到两种应用程序包清单文件:

  • Package.appxmanifest
    这是一种 XML 样式文件,开发人员使用该文件配置应用程序的详细信息,如发布者信息、徽标、处理器体系结构等。这是应用程序开发期间使用的应用程序包清单的可配置临时版本。
  • AppxManifest.xml
    此文件由 Visual Studio 生成过程生成,基于 appxmanifest.xml 文件中的信息。 这是用于已发布应用和旁加载应用的应用程序包清单的最终版本。 如果对 appxmanifest.xml 文件进行了任何更新,则必须重新生成项目才能查看 AppxManifest.xml 文件中的更新。

有关打包过程的概述,请参阅使用 Visual Studio 打包 UWP 应用

验证应用程序清单

您必须先纠正导致任何 Visual Studio 验证检查失败的所有错误,然后才能发布您的应用程序。 在 Visual Studio 生成清单时,Visual Studio 会通过以下方式验证您的应用程序:

  • 语法验证
    Visual Studio 确认应用程序清单中的所有数据是否都符合应用程序清单架构。
  • 语义验证
    Visual Studio 根据信息的上下文提供针对所需数据的指导。

注意

如果这些部分不涉及你要查找的字段,则从可能已单独配置的数据或清单架构中的默认值生成。

生成清单内容

Visual Studio 在生成应用包的 AppxManifest.xml 文件时,填充下表中的字段。

标识

Identity应用程序清单的部分包含以下字段。

字段 说明
名称 包的名称,在下列情况下,将以不同的方式填充包的名称:
  • 默认情况下,此字段的值为生成的 GUID。
  • 如果将应用程序与 Microsoft Store 相关联,或调用 "存储- > 创建应用包 ... " 命令,然后使用开发人员帐户登录,则会从 "Microsoft Store" 或 "合作伙伴中心" 中的关联应用检索此字段的值。
  • 如果调用 " 存储- > 创建应用包 ... " 命令,但不使用开发人员帐户登录,则此字段的值取自源清单。
Publisher 发行者的名称。 在以下几种情况下,会以不同方式填充此名称:
  • 默认情况下,此字段的值是你的用户名。
  • 如果将应用程序与 Microsoft Store 相关联,或调用 "存储- > 创建应用包 ... " 命令,然后使用开发人员帐户登录,则此字段的值是与该帐户关联的发布服务器。
  • 如果调用了 " 存储- > 创建应用包 ... " 命令,但没有使用开发人员帐户登录,则此字段的值将与用于对应用程序包进行签名的测试证书的 "使用者" 字段相匹配。
Visual Studio 仅支持发布服务器的公用名 (CN) 窗体,并将前缀 "CN =" 添加到清单中的 "发布者" 字段。
版本 正在生成的应用的版本。 这通常会在每次修改并打包应用时递增。 若要确保 Version 正确递增,请使用调用 " 存储- > 创建应用包 ... " 时提供的对话框进行更新。
ProcessorArchitecture 一个基于您为项目指定的生成配置生成的值。 如果项目中的项目引用或文件引用的目标体系结构不同于应用程序包,则会引发生成错误,并且必须更改应用包的目标体系结构,使其适用于所有引用。

下面是输出 XML 的示例 Identity

<Identity Name="Microsoft.UWPAppExample"
          Publisher="CN=Microsoft Corporation"
          Version="1.0.0.0"
          ProcessorArchitecture="x86" />

属性

Properties应用程序清单的部分包含下表中的字段。

字段 说明
PublisherDisplayName 在以下方案中,此字符串的填充方式不同:
  • 默认情况下,此字段的值是你的用户名。
  • 如果将应用程序与 Microsoft Store 相关联,或调用 "存储- > 创建应用包 ... " 命令,然后使用开发人员帐户登录,则此字段的值与与开发人员帐户关联的 PublisherDisplayName 字符串匹配。
  • 如果调用 " 存储- > 创建应用包 ... " 命令,但不使用开发人员帐户登录,则此字段的值为你的用户名,除非你在 appxmanifest.xml 文件中另行指定。
DisplayName 在以下几种情况下,会以不同方式填充此字符串:
  • 默认情况下,此字段的值是项目的名称。
  • 如果将应用程序与 Microsoft Store 相关联,或调用 "存储- > 创建应用包 ... " 命令,然后使用开发人员帐户登录,则会根据以下规则填充此字段的值:
    • 如果在源清单中指定此值,并且值 @ 以 (表示你要将此值) 本地化,则此字段的值将与指定的值匹配。
    • 如果选定的应用程序只有一个名称,此值将为该名称。
    • 如果所选应用有多个名称,但源清单未本地化,则该值将设置为源清单中的显示名称。 否则,此值设置为第一个保留名称。
  • 如果调用 " 存储- > 创建应用包 ... " 命令,但不使用开发人员帐户登录,则此字段的值取自源清单。
徽标 默认情况下,Visual Studio 模板将使用 Assets\StoreLogo.png 。 Appxmanifest.xml 文件中的开发人员应自定义此值。

下面是输出 XML 的示例 Properties

<Properties>
    <DisplayName>UWP App Example</DisplayName>
    <PublisherDisplayName>Microsoft Corporation</PublisherDisplayName>
    <Logo>Assets\StoreLogo.png</Logo>
</Properties>

应用程序

应用程序清单可以包含多个 Application 元素,每个元素都有一个显示名称,它显示在客户端上的磁贴上。 Application应用程序清单的部分包含下表中的字段。

字段 说明
ID 在以下几种情况下,会以不同方式填充此字符串:
  • 默认情况下,此字段的值是项目的名称。
  • 如果将应用程序与 Microsoft Store 相关联,或调用 "存储- > 创建应用包 ... " 命令,然后使用开发人员帐户登录,则此字段的值为选定应用的应用名称(如果源清单中的 /Properties[@DisplayName]/Applications/Application[@DisplayName] 匹配)。 否则,此值与源清单中的值保持一致。
  • 如果调用了 " 存储- > 创建应用包 ... " 命令,但未使用开发人员帐户登录,则此字段的值与源清单中的值相同。
可执行文件 此字段的值是项目程序集的输出名称。 源清单文件中使用的可执行标记 $targetnametoken $.exe,在生成清单时,将使用实际文件名替换 (appxmanifest.xml) 。
EntryPoint 此值基于生成 Executable 的值和 Id 值。

示例 Application 输出:

<Applications>
    <Application Id="App" Executable="UWPAppExample.exe" EntryPoint="UWPAppExample.App">
        <!-- Other elements configured within the Application, such as Extensions, VisualElements, etc. -->
</Applications>

PackageDependency

PackageDependency部分包含此包的所有 Windows 组件库依赖项。 例如,如果你的项目具有对 WinJS 的引用,则在生成清单时,Visual Studio 将检索依赖项的包标识信息。 然后 Visual Studio 在此部分中填充每个相关包的 NameMinVersion 字段。

在本机 c + + 项目中,Visual Studio 将添加对 Visual C/c + + 运行时的引用:

<Dependencies>
    <PackageDependency Name="Microsoft.VCLibs.140.00.Debug" MinVersion="14.0.30035.0" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
</Dependencies>

Windows 运行时注册扩展

您可以为应用程序实现 Windows 运行时组件,但需要向操作系统注册这些组件,使其正常运行。 若要注册 Windows 运行时组件,你必须将注册信息放在 WinMD 文件和应用程序清单中。 如果项目实现 Windows 运行时组件,则项目的生成输出将包含 WinMD 文件。 Visual Studio 从 WinMD 文件提取 Windows 运行时注册信息,并在应用程序清单中生成相应 Extension 的元素。

系统支持两种形式的服务器:.dll 服务器(进程中)和 .exe 服务器(进程外)。 这些服务器要求必须将相似但不同的注册信息复制到应用程序清单中。 Visual Studio 仅支持为 .dll 服务器生成清单,注册 .dll 服务器需要 DLLServer 扩展。 从 WinMD 文件提取应用程序清单中的以下值来构造 DLLServer 扩展:

  • DllPath
  • ActivatableClassId
  • ThreadingModel
  • ActivatableClass(ActivatableClassId 特性)

下面是输出 XML 的一个示例:

<extension category="Microsoft.Windows.ActivatableClass">
    <dllServer>
        <dllPath>Fabrikam.dll</dllPath>
        <activatableClass activatableClassId="Fabrikam.MyClass" threadingModel="sta" />
    </dllServer>
</extension>

有关此主题的详细信息,请参阅Windows 运行时组件

资源

Resources部分包含应用程序支持的每种语言的条目。 在应用程序清单中必须至少指定一种资源语言。 Visual Studio 将根据项目中的本地化信息自动生成受支持语言的列表。 生成清单时,将在源清单文件中使用的资源语言标记 "x-生成" (appxmanifest.xml) 替换为实际语言代码。 下面是输出 XML 的一个示例:

<Resources>
    <Resource Language="en-us">
    <Resource Language="fr-fr">
</Resources>

列表中的第一项是应用程序的默认语言。

TargetDeviceFamily

TargetDeviceFamily部分包含以下字段:

  • 名称
  • MinVersion
  • MaxVersionTested
<Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.22000.0" />
</Dependencies>

这些元素通过 MSBuild 属性进行填充。

请参阅

使用 Visual Studio 打包 UWP 应用
应用包体系结构
Windows 10 包清单架构参考