Wix 安装程序包产生损坏的“msi”

Posted

技术标签:

【中文标题】Wix 安装程序包产生损坏的“msi”【英文标题】:Wix installer bundle produces corrupt "msi" 【发布时间】:2013-10-02 10:24:24 【问题描述】:

使用与示例几乎相同的非常简单的代码:

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Bundle Version="1.0" Manufacturer="ACME" UpgradeCode="6AF8AF7D-3B44-4496-9E64-56206DF66C55">
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense"/>
    <Chain>
    <MsiPackage SourceFile="wpftoolkit.msi"/>
    </Chain>
    </Bundle>
    </Wix>

我得到一个 setup.msi 文件,它在启动时立即产生错误:

    msiexec /i setup.msi /l*v log.txt
    log.txt:
    === Verbose logging started: 02.10.2013  14:12:11  Build type: SHIP UNICODE 5.00.7600.00  Calling process: C:\Windows\system32\msiexec.exe ===
    MSI (c) (B0:48) [14:12:11:804]: Font created.  Charset: Req=204, Ret=204, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg
    MSI (c) (B0:48) [14:12:11:805]: Font created.  Charset: Req=204, Ret=204, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg
    MSI (c) (B0:A4) [14:12:11:823]: Resetting cached policy values
    MSI (c) (B0:A4) [14:12:11:823]: Machine policy value 'Debug' is 0
    MSI (c) (B0:A4) [14:12:11:823]: ******* RunEngine:
    ******* Product: Setup.msi
    ******* Action: 
    ******* CommandLine: **********
    MSI (c) (B0:A4) [14:12:11:824]: Note: 1: 2203 2: Setup.msi 3: -2147286960 
    MSI (c) (B0:A4) [14:12:11:824]: MainEngineThread is returning 1620
    === Verbose logging stopped: 02.10.2013  14:12:11 ===

Wix SDK 中的工具 dark.exe 显示 setup.msi 已损坏且无法反汇编。 上周我有几次设法编译了这种类型的包,并且 msi 运行良好,但我无法弄清楚我正在做的事情之间有什么关联。

我也尝试在不使用 MSBuild 的情况下编译此示例,但直接使用 Wix SDK 工具 - 仍然没有运气 - 编译完成时没有错误,但生成的 msi 还是损坏了:

    candle *.wxs
    light *.wixobj -out setup.msi -ext WixBalExtension

在编译 Wix 包时我是否遗漏了一些东西,导致它无法正常工作?

【问题讨论】:

【参考方案1】:

Wix/Bundle 用于生成将安装程序链接在一起的可执行文件。因此,应为输出提供 .exe 扩展名。

您可以手动调用 WiX Toolset 编译器和链接器,就像您已经完成或使用 MSBuild 项目一样。 WiX 安装一个模板项目供 Visual Studio 使用。它被称为 WiX 引导程序。如果您不知道,Visual Studio 和 SharpDevelop 项目都是 MSBuild 项目。因此,还有另外两种构建构建的方法:通过 IDE 或在命令行中使用 msbuild.exe。

注意:如果在 Visual Studio 之前安装 WiX,Visual Studio 将不会显示四个 WiX 项目模板。在这种情况下,只需修复 WiX 安装即可。

【讨论】:

在 SharpDevelop 中,我没有创建 Wix Budle 项目的选项。只有空项目和不同风格的 WixUI 项目。 .wixproj 文件中也没有指定输出文件参数的选项。我相信这取决于特定的 wix .target 文件。【参考方案2】:

这绝对是违反直觉的,但我想我已经找到了解决方案:

candle *.wxs
light *.wixobj -out setup.EXE -ext WixBalExtension

输出格式是EXE,而不是MSI。很简单吧?

顺便说一句,SharpDevelop(我相信还有 Visual Studio)没有任何选项可以将输出文件指定为 EXE - 只有 MSI、msp 和 wixlib。

【讨论】:

作为 SharpDevelop IDE 的一种解决方法,我添加了一个用 Setup.exe 替换 Setup.msi 的构建后脚本(只是重命名不起作用)。我不只是切换到某个 make.bat 文件的主要原因是 wxs 文件中有几个预处理器变量(即 $(var.OtherProject.TargetPath))需要在编译步骤(candle.exe)中解决.所以构建后的脚本是: rm $(Target); light obj\$(Configuration)*.wixobj -ext WixBalExtension -out bin\$(Configuration)\$(SolutionName).exe

以上是关于Wix 安装程序包产生损坏的“msi”的主要内容,如果未能解决你的问题,请参考以下文章

用Wix手工编辑XML制作C++ MSI安装程序,怎样保证安装新版本时候强制卸载旧版本,急急急!!!

如何强制 WiX 引导程序下载 MSI 包?

回滚到以前版本的 WiX 捆绑安装程序

WiX 刻录包安装程序 - 升级安装时未更新 ExePackage

使用 WiX 为 InstallShield 安装程序创建 msi 包装器

如何使用 WIX 使用单个 MSI 包安装两个 MSI 包?