使用 MakeAppx.exe 创建 MSIX 包或捆绑包

MakeAppx.exe 同时创建应用包(.msix 或 .appx)和应用包捆绑包(.msixbundle 或 .appxbundle)。 MakeAppx.exe 还会从应用包或捆绑包中提取文件,并加密或解密应用包和捆绑包。 此工具包含在 Windows 10 SDK 中,可从命令提示符或脚本文件使用。

有关如何使用 MakeApp.exe 打包桌面应用的信息,请参阅 手动打包桌面应用

重要

如果使用 Visual Studio 开发应用,建议使用 Visual Studio 向导创建应用包。 有关详细信息,请参阅 使用 Visual Studio 打包 UWP 应用使用 Visual Studio 从源代码打包桌面应用

重要

请注意, MakeAppx.exe 不会创建 应用包上传文件(.appxupload 或 .msixupload),这是建议用于 提交到合作伙伴中心的有效应用包类型。 应用包上传文件通常 作为 Visual Studio 打包过程的一部分创建,不过也可以 手动创建它。

使用 MakeAppx.exe

根据 SDK 的安装路径,您 Windows 10 电脑上的 MakeAppx.exe 在这里:

  • C:\Program Files (x86)\Windows Kits\10\bin\<构建号>\<架构>\makeappx.exe

其中 <体系结构> = x86、x64、arm、arm64 或 chpe。 或者它可能位于:

  • C:\Program Files (x86)\Windows Kits\10\App Certification Kit\makeappx.exe

MakeAppx.exe 语法和选项

常规 MakeAppx.exe 语法:

MakeAppx <command> [options]      

下表描述了 MakeAppx.exe的命令。

命令 说明
包 / 打包 创建包。
解压 将指定包中的所有文件提取到指定输出目录。
捆绑包 创建捆绑包。
解绑包 将所有包解压缩到以捆绑包或包全名命名的指定输出路径下的子目录。
加密 在指定的输出包/捆绑包处从输入包/捆绑包创建加密的应用包或捆绑包。
解密 从指定的输出包/捆绑包的输入应用包/捆绑包创建解密的应用包或捆绑包。

此选项列表适用于所有命令:

选项 说明
/d 指定输入、输出或内容目录。
/l 用于本地化包。 对本地化包进行默认验证。 此选项仅禁用该特定验证,而无需禁用所有验证。
/kf 使用指定密钥文件中的密钥加密或解密包或捆绑包。 这不能与 /kt 一起使用。
/kt 使用全局测试密钥加密或解密包或捆绑包。 这不能与 /kf 一起使用。
/不 防止覆盖已存在的输出文件。 如果未指定此选项或 /o 选项,系统会询问用户是否要覆盖该文件。
/内华达州 跳过语义验证。 如果未指定此选项,则该工具将执行包的完整验证。
/o 覆盖输出文件(如果存在)。 如果未指定此选项或 /no 选项,系统会询问用户是否要覆盖文件。
/p 指定应用包或捆绑包。
/v 启用控制台的详细日志记录输出。
/? 显示帮助文本。

以下列表包含可能的参数:

论点 说明
<输出包名称> 创建的包的名称。 这是追加了 .msix 或 .appx 的文件名。
<加密的输出包名称> 创建的加密包的名称。 这是追加了 .emsix 或 .eappx 的文件名。
<输入包名称> 包的名称。 这是追加了 .msix 或 .appx 的文件名。
<加密的输入包名称> 加密包的名称。 这是追加了 .emsix 或 .eappx 的文件名。
<输出捆绑包名称> 创建的捆绑包的名称。 这是追加了 .msixbundle 或 .appxbundle 的文件名。
<加密的输出包名称> 创建的加密捆绑包的名称。 这是追加了 .emsixbundle 或 .eappxbundle 的文件名。
<输入捆绑名称> 捆绑包的名称。 这是追加了 .msixbundle 或 .appxbundle 的文件名。
<加密输入包名称> 加密捆绑包的名称。 这是追加了 .emsixbundle 或 .eappxbundle 的文件名。
<内容目录> 应用包或捆绑内容的路径。
映射文件<> 指定包源和目标的文件名。
<输出目录> 输出包和捆绑包的目录的路径。
<密钥文件> 包含用于加密或解密的密钥的文件的名称。
算法 ID<> 创建块映射时使用的算法。 有效算法包括:SHA256(默认值)、SHA384、SHA512。

创建应用包

应用包是打包到 .msix 或.appx包文件中的应用文件的完整集。 若要使用 pack 命令创建应用包,必须为包的位置提供内容目录或映射文件。 还可以在创建包时对其进行加密。 如果要加密包,则必须使用 /ep 并指定使用的是密钥文件(/kf)或全局测试密钥(/kt)。 有关创建加密包的详细信息,请参阅 加密或解密包或捆绑包

特定于 pack 命令的选项:

选项 说明
/f 指定映射文件。
/h 指定创建块映射时使用的哈希算法。 这只能与 pack 命令一起使用。 有效算法包括:SHA256(默认值)、SHA384、SHA512。
/m 指定输入应用清单的路径,该清单将用作生成输出应用包或资源包清单的基础。 使用此选项时,还必须使用 /f 并在映射文件中包括 [ResourceMetadata] 节,以指定要包含在生成的清单中的资源维度。
/数控 防止包文件被压缩。 默认情况下,文件会根据检测到的文件类型进行压缩。
/r 生成资源包。 这必须与 /m 一起使用,这意味着使用 /l 选项。

以下用法示例显示了 pack 命令的一些可能的语法选项:

MakeAppx pack [options] /d <content directory> /p <output package name>
MakeAppx pack [options] /f <mapping file> /p <output package name>
MakeAppx pack [options] /m <app package manifest> /f <mapping file> /p <output package name>
MakeAppx pack [options] /r /m <app package manifest> /f <mapping file> /p <output package name>
MakeAppx pack [options] /d <content directory> /ep <encrypted output package name> /kf <key file>
MakeAppx pack [options] /d <content directory> /ep <encrypted output package name> /kt

下面显示了 pack 命令的命令行示例:

MakeAppx pack /v /h SHA256 /d "C:\My Files" /p MyPackage.msix
MakeAppx pack /v /o /f MyMapping.txt /p MyPackage.msix
MakeAppx pack /m "MyApp\AppxManifest.xml" /f MyMapping.txt /p AppPackage.msix
MakeAppx pack /r /m "MyApp\AppxManifest.xml" /f MyMapping.txt /p ResourcePackage.msix
MakeAppx pack /v /h SHA256 /d "C:\My Files" /ep MyPackage.emsix /kf MyKeyFile.txt
MakeAppx pack /v /h SHA256 /d "C:\My Files" /ep MyPackage.emsix /kt

创建一个应用程序包

应用捆绑包类似于应用包,但捆绑包可以减小用户下载的应用的大小。 例如,应用捆绑包适用于特定于语言的资产、不同的映像规模资产或应用于特定版本的 Microsoft DirectX 的资源。 与创建加密的应用包类似,还可以在捆绑应用包时加密应用捆绑包。 若要加密应用捆绑包,请使用 /ep 选项并指定你使用的是密钥文件(/kf)还是全局测试密钥(/kt)。 有关创建加密捆绑包的详细信息,请参阅 加密或解密包或捆绑包

捆绑命令的特定选项:

选项 说明
/bv 指定捆绑包的版本号。 版本号必须分为四个部分,格式为:主版本号<>.次版本号<>.内部版本号<>.修订号<>.
/f 指定映射文件。

请注意,如果未指定捆绑包版本,或者如果捆绑包设置为“0.0.0.0”,则使用当前日期时间创建捆绑包。

以下用法示例显示了 捆绑包 命令的一些可能的语法选项:

MakeAppx bundle [options] /d <content directory> /p <output bundle name>
MakeAppx bundle [options] /f <mapping file> /p <output bundle name>
MakeAppx bundle [options] /d <content directory> /ep <encrypted output bundle name> /kf MyKeyFile.txt
MakeAppx bundle [options] /f <mapping file> /ep <encrypted output bundle name> /kt

以下块包含 捆绑包 命令的示例:

MakeAppx bundle /v /d "C:\My Files" /p MyBundle.msixbundle
MakeAppx bundle /v /o /bv 1.0.1.2096 /f MyMapping.txt /p MyBundle.msixbundle
MakeAppx bundle /v /o /bv 1.0.1.2096 /f MyMapping.txt /ep MyBundle.emsixbundle /kf MyKeyFile.txt
MakeAppx bundle /v /o /bv 1.0.1.2096 /f MyMapping.txt /ep MyBundle.emsixbundle /kt

从包或捆绑包中提取文件

除了打包和捆绑应用之外, MakeAppx.exe 还可以解包或解包现有包。 您必须提供内容目录作为提取文件的目标位置。 如果尝试从加密包或捆绑包中提取文件,则可以使用 /ep 选项同时解密和提取文件,并指定是否应使用密钥文件(/kf)或全局测试密钥(/kt)对其进行解密。 有关解密包或捆绑包的详细信息,请参阅 加密或解密包或捆绑包

特定于 解压缩取消包命令 的选项:

选项 说明
/nd 在解压缩或取消捆绑包时不执行解密。
/pfn 将所有文件解压到指定的输出路径下,并在该路径中新建一个以捆绑包或包全名命名的子目录。

以下用法示例显示了 解压缩解包 命令的一些可能的语法选项:

MakeAppx unpack [options] /p <input package name> /d <output directory>
MakeAppx unpack [options] /ep <encrypted input package name> /d <output directory> /kf <key file>
MakeAppx unpack [options] /ep <encrypted input package name> /d <output directory> /kt

MakeAppx unbundle [options] /p <input bundle name> /d <output directory>
MakeAppx unbundle [options] /ep <encrypted input bundle name> /d <output directory> /kf <key file>
MakeAppx unbundle [options] /ep <encrypted input bundle name> /d <output directory> /kt

以下块包含使用 解包解包 命令的示例:

MakeAppx unpack /v /p MyPackage.msix /d "C:\My Files"
MakeAppx unpack /v /ep MyPackage.emsix /d "C:\My Files" /kf MyKeyFile.txt
MakeAppx unpack /v /ep MyPackage.emsix /d "C:\My Files" /kt

MakeAppx unbundle /v /p MyBundle.msixbundle /d "C:\My Files"
MakeAppx unbundle /v /ep MyBundle.emsixbundle /d "C:\My Files" /kf MyKeyFile.txt
MakeAppx unbundle /v /ep MyBundle.emsixbundle /d "C:\My Files" /kt

加密或解密包或捆绑包

MakeAppx.exe 工具还可以加密或解密现有包或捆绑包。 只需提供包名称、输出包名称,以及加密或解密是否应使用密钥文件(/kf)或全局测试密钥(/kt)。

在 Visual Studio 打包向导中,加密和解密功能不可用。

特定于 加密解密 命令的选项:

选项 说明
/ep 指定加密的应用包或捆绑包。

以下用法示例显示了 加密解密 命令的一些可能的语法选项:

MakeAppx encrypt [options] /p <package name> /ep <output package name> /kf <key file>
MakeAppx encrypt [options] /p <package name> /ep <output package name> /kt

MakeAppx decrypt [options] /ep <package name> /p <output package name> /kf <key file>
MakeAppx decrypt [options] /ep <package name> /p <output package name> /kt

以下块包含使用 加密解密 命令的示例:

MakeAppx.exe encrypt /p MyPackage.msix /ep MyEncryptedPackage.emsix /kt
MakeAppx.exe encrypt /p MyPackage.msix /ep MyEncryptedPackage.emsix /kf MyKeyFile.txt

MakeAppx.exe decrypt /p MyPackage.msix /ep MyEncryptedPackage.emsix /kt
MakeAppx.exe decrypt p MyPackage.msix /ep MyEncryptedPackage.emsix /kf MyKeyFile.txt

密钥文件

密钥文件必须以包含字符串“[Keys]”的行开头,后跟描述用于加密每个包的密钥的行。 每个键由引号中的一对字符串表示,用空格或制表符分隔。 第一个字符串表示 base64 编码的 32 字节密钥 ID,第二个字符串表示 base64 编码的 32 字节加密密钥。 密钥文件应该是一个简单的文本文件。

密钥文件的示例:

[Keys]
"OWVwSzliRGY1VWt1ODk4N1Q4R2Vqc04zMzIzNnlUREU="    "MjNFTlFhZGRGZEY2YnVxMTBocjd6THdOdk9pZkpvelc="

映射文件

映射文件必须以包含字符串“[Files]”的行开头,后跟描述要添加到包的文件的行。 每个文件由引号中的一对路径描述,用空格或制表符分隔。 每个文件都表示其源(磁盘上)和目标(包中)。 映射文件应该是一个简单的文本文件。

映射文件的示例(没有 /m 选项):

[Files]
"C:\MyApp\StartPage.html"               "default.html"
"C:\Program Files (x86)\example.txt"    "misc\example.txt"
"\\MyServer\path\icon.png"              "icon.png"
"my app files\readme.txt"               "my app files\readme.txt"
"CustomManifest.xml"                    "AppxManifest.xml"

使用映射文件时,可以选择是否要使用 /m 选项。 /m 选项允许用户指定要包含在生成的清单中的映射文件中的资源元数据。 如果使用 /m 选项,则映射文件必须包含一个以 “[ResourceMetadata]” 行开头的部分,后跟用于指定“ResourceDimensions”和“ResourceId”的行。应用包可以包含多个“ResourceDimensions”,但“ResourceId”始终仅限于一个。

映射文件的示例(带有 /m 选项):

[ResourceMetadata]
"ResourceDimensions"                    "language-en-us"
"ResourceId"                            "English"

[Files]
"images\en-us\logo.png"                 "en-us\logo.png"
"en-us.pri"                             "resources.pri"

语义验证由 MakeAppx.exe 执行

MakeAppx.exe 执行有限的信号验证,旨在捕获最常见的部署错误,并帮助确保应用包有效。 如果要在使用 MakeAppx.exe时跳过验证,请参阅 /nv 选项。

此验证可用于确保:

  • 应用包中包含包清单中引用的所有文件。
  • 应用程序没有两个完全相同的密钥。
  • 应用程序不会从此列表中注册禁止的协议:SMB、FILE、MS-WWA-WEB、MS-WWA。

这不是完整的语义验证,因为它仅用于捕获常见错误。 不保证 MakeAppx.exe 生成的包可安装。