用 WiX Burn 制作托管安装包:出现 0x80131508 错误

使用 WiX 的 Burn 引擎制作自定义托管引导程序的 exe 安装包时,双击生成的安装包没有反应。如果查看日志可以发现有 0x80131508 错误。本文介绍其调查和解决方法。


现象

双击制作的自定义引导程序的 exe 安装包没有反应,通过查看 Burn 引擎的输出日志可以发现如下关键的错误码:

...
[BCD8:B4DC][2021-07-16T11:47:32]i000: Loading managed bootstrapper application.
[BCD8:B4DC][2021-07-16T11:47:32]e000: Error 0x80131508: Failed to create the managed bootstrapper application.
[BCD8:B4DC][2021-07-16T11:47:32]e000: Error 0x80131508: Failed to create UX.
[BCD8:B4DC][2021-07-16T11:47:32]e000: Error 0x80131508: Failed to load UX.
[BCD8:B4DC][2021-07-16T11:47:32]e000: Error 0x80131508: Failed while running 
...
[BCD8:B4DC][2021-07-16T11:47:32]e000: Error 0x80131508: Failed to run per-user mode.
[BCD8:B4DC][2021-07-16T11:47:32]i007: Exit code: 0x80131508, restarting: No

调查

通过查询 HRESULT 错误码 0x80131508 可以得知它代表的意思是“INDEXOUTOFRANGE”。啊这……说明是 Burn 引擎出现了内部因为某些原因出现了错误,并且没有正确把错误原因标记出来。

然而对我们简单的托管安装包界面来说,更可能是我们自己的某些配置或代码不正确,导致 Burn 引擎内部代码炸掉的。

解决

这样的错误几乎不具有可调试性。因此,我直接将我偶然发现的原因和解决办法贴出来。

参考这篇入门教程中的代码,如果 AssemblyInfo.cs 文件中缺少标记 BootstrapperApplication 类型的特性,那么就会出现此错误。

...
++  using Microsoft.Tools.WindowsInstallerXml.Bootstrapper;

++  using Walterlv.InstallerUI;

++  [assembly: BootstrapperApplication(typeof(Program))]
...

然而呀,官方在教大家写托管引导程序的时候,翻遍了整个文档都没有提醒过要写这个特性!所以特别容易被官方文档带偏,这里记录此文章避免大家踩坑。

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/wix-managed-bootstrapper-application-error-80131508.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,或者前往 CSDN 关注我的主页

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected])