修改 wix 制作的捆绑包二进制文件

modify wix-made bundle binary

这是我的情况。我有一个带有自定义安装程序的 WiX 捆绑包 UI。它打包了一个 MSI(没有 UI)。你可以从我的服务器下载那个包。我想在下载之前修改该包,以将服务器的当前地址传递到 MSI。 (MSI 设置为将服务器地址作为参数并将其写入 app.config。)

我知道这可以使用 Microsoft.Deployment.WindowsInstaller 库直接在 MSI 上完成(尽管我不确定我是否可以在签名的 MSI 和捆绑包上这样做)。

这些选项中的哪一个是实现此目标的最佳方式?

  1. 在包中进行二进制替换。 (我试图在捆绑二进制文件中找到服务器参数。我看不到任何此类信息。)

  2. 使用 CodeDom 将捆绑 EXE 重新打包为新的 .NET EXE。新的 EXE 包含作为嵌入式资源的原始包,提取到临时文件并运行它。这是我目前的方法,但要正确设置所有属性并将资源一并进出是很痛苦的。我还没有成功

  3. 使用 WiX 提取捆绑包,修改源代码,然后重建它。我不确定这如何与签名包一起玩。它还需要我在我的服务器旁边安装 WiX。我可以在捆绑包中使用一些 PackageRef 来安装 WiX 本身吗?

  4. 找到 CAB 文件头。提取它。修改微星。替换包中的 CAB 字节。我试过这种方法。它给了我这个错误:无法验证有效负载的哈希值。我看不到散列在包中的编码位置。

  5. 使用其他一些我不知道的二进制操作或 API?我可以使用任何版本的 WiX。

使用VBScript 或类似的脚本语言为MSI 打补丁。喜欢答案here。但是,您需要在修补后重新签名包。否则你最终会得到一个带有无效签名的 MSI。

或者向您的 MSI 添加一个自定义操作,询问您的服务器 URL 它应该使用什么。

更新

经过一番思考,我想我会在服务器上编译这个包。只需以编程方式生成 Bundle.wxs,并将 属性 设置为有问题的 url - 然后使用与往常相同的命令行编译它(如果您在构建日志中应该可用)重新使用 Visual Studio)。在你Chain中,加上这个:

<MsiPackage Id="MySoftware" SourceFile="$(var.Setup.TargetPath)" Vital="yes">
  <MsiProperty Name="MyUrl" Value="URL_WRITTEN_BY_SERVER"  />
</MsiPackage>

有关 MsiPackage 元素的更多信息 here

我可以让 none 的其他选项起作用。我实际上最终用 iexpress.exe 重新打包了我的 EXE(在处理这个问题之前我不知道它的存在)。我重新打包它并使用覆盖服务器地址的命令行使包调用原始包。重新打包是作为服务器安装程序的自定义步骤完成的。