modify wix-made bundle binary

本文关键字:binary bundle wix-made modify | 更新日期: 2023-09-27 18:04:53

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

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

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

  1. 在包中执行二进制替换。(我试图在包的二进制文件中找到服务器参数。

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

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

  4. 查找CAB文件头。提取它。修改MSI。替换包中的CAB字节。我尝试了这种方法。它给了我这个错误:未能验证有效负载的哈希值。

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

modify wix-made bundle binary

使用VBScript或类似的脚本语言修补MSI。比如这里的答案。但是,您需要在修补包后重新签名。否则你最终会得到一个签名无效的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元素的更多信息请点击这里

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