同一个 Windows Store 应用程序包中的不同 SQLite 构建

Different builds of SQLite in the same Windows Store app bundle

我在将我的应用程序更新部署到商店时遇到问题。

应用程序 运行s SQLite,我最近发现它在某些 x64 架构上会引发错误。

BadImageFormatException: An attempt was made to load a program with an incorrect format.

我明白这意味着什么。应用程序的 x64 版本使用 sqlite3.dll 的 x86 编译版本。我可以解决这个问题并通过以下方法构建 x64 版本。

  1. 打开项目 > 属性,并将平台和平台目标设置为 x64。
  2. 保存
  3. 打开 Build > Configuration Manager 并将 Active Platform 和 Platform (Release) 设置为 x64。
  4. 构建项目
  5. 打开项目 > 商店 > 创建应用包并生成我的包

这将使用 sqlite3.dll

的 x64 版本创建一个 正确的 x64 应用程序包

针对所有三种架构(x86、x64 和 ARM)执行此操作后,我得到了三个单独的 appxbundle 文件。当我通过开发者仪表板将新包上传到商店时,我只能上传其中的 一个

如果我打开 "Create App Packages" 并为我的捆绑包选择所有三种架构,它会为所有三个生成一个 appxbundle。但是,当我解压缩这个 appxbundle 时,我可以看到 x64 构建使用的是 x86 编译的 sqlite3.dll 而不是 x64 版本。

我尝试在 7zip 中打开 appxbundle 并替换文件,但 7zip 无法写入文件,只能读取它。

然后我尝试解压缩 appxbundle 并将三个构建中的每一个替换为单个 appxbundle 中的正确构建。然后,我不使用压缩将这些文件压缩在一起,并将 .zip 重命名为 .appxbundle,但商店拒绝将其视为无效文件。

我猜正在进行某种签名或专有压缩。老实说,我没想到它会起作用,但值得一试。

如何为每个架构构建我的应用程序的 正确 版本并将其包含在单个 appxbundle 中?我可以从单独的构建中手动创建自己的 appxbundle 吗?

解决方案

我已经接受了下面 crea7or 的回答,但我只是想稍微扩展一下

使用 MakeAppX.exe 命令行工具,我能够使用以下命令正确解绑和重新绑定我的 appxbundle 文件

// to unbundle 
MakeAppX.exe unbundle /p MyPackage.appxbundle /d MyPackage
// to bundle
MakeAppX.exe bundle /d MyPackage /p MyPackage.appxbundle

几个方便的指示。请确保使用 8.1 版本的 MakeAppX,因为 8.0 版本无法捆绑或取消捆绑。

C:\Program Files (x86)\Windows Kits.1\bin\x86\makeappx.exe

如果您只需将此路径添加到高级系统设置中的 PATH 环境变量,就可以省去很多麻烦和打字。这样您就可以从任何位置 运行 MakeAppX。这对我们这一代人来说似乎很明显,但并不是每个人都对 DOS 如此熟悉。 =)

Visual Studio 创建 .appxupload 个包,根据 this question,它们是重命名为 .appxupload 的 zip 文件。 MakeAppX 无法创建或取消捆绑 .appxupload 包 - 您必须使用 zip 应用程序。

但是,我使用 7zip 创建的任何 .appxupload 包在上传时都 验证。幸运的是,商店似乎会直接接受 .appxbundle,所以我根本不需要将其压缩,只需将其捆绑即可。我已经把这个提交给商店了。如果它获得批准,我会报告。

更新

上述 appxbundle 文件未获批准,未通过技术测试。我再次尝试了 zip 方法,这次被接受了,如果通过,我会再次报告。

总结一下:

c:\MyApp.appxupload -> [unzip] -> c:\MyApp\
c:\MyApp\MyApp.appxbundle -> [makeappx unbundle] -> c:\MyApp\MyApp\
c:\MyApp\MyApp\MyApp.appx -> [do whatever you need to here]
c:\MyApp\MyApp\ -> [makeappx bundle] -> c:\MyApp\MyApp.appxbundle
c:\MyApp\ -> [zip] -> c:\MyApp.zip
c:\MyApp.zip -> [rename] -> c:\MyApp.appxupload

您应该使用 MakeAppx tool to create valid appx package bundle, because they are signed. Here is 关于创建捆绑包的教程。