这是我的情况。我有一个带有自定义安装程序UI的WiX捆绑包。它有一个MSI打包到它(没有UI)。您可以从我的服务器下载该捆绑包。我想在它下载之前修改该捆绑包以将服务器的当前地址传递到MSI。 (MSI设置为将服务器地址作为参数并将其写入app.config。)
我知道这可以使用Microsoft.Deployment.WindowsInstaller库直接在MSI上完成(虽然我不确定我是否可以在签名的MSI和捆绑上执行此操作)。 / p>
这些选项中的哪一个是实现此目的的最佳方式?
在捆绑中执行二进制替换。 (我试图在捆绑二进制文件中找到服务器参数。我看不到任何类型的东西。)
使用CodeDom将捆绑包EXE重新打包到新的.NET EXE中。新的EXE包含原始包作为嵌入式资源,提取到临时文件,运行它。这是我目前的方法,但是让所有属性正确并将资源整合到一起是很痛苦的。我还没有成功。
使用WiX提取包,修改源,然后重建它。我不确定如何使用已签名的捆绑包。它还需要我在我的服务器旁边安装WiX。我可以在捆绑包中使用一些PackageRef来安装WiX吗?
找到CAB文件头。提取它。修改MSI。重新捆绑捆绑包中的CAB字节。我试过这种方法。它给了我这个错误:无法验证有效负载的哈希值。我无法看到哈希在包中编码的位置。
使用其他我不知道的二进制操作或API?我可以使用任何版本的WiX。
答案 0 :(得分:1)
使用VBScript或类似的脚本语言修补MSI。像答案here一样。但是,您需要在修补后重新签名包。否则,您最终会得到一个签名无效的MSI。
或者向MSI添加一个自定义操作,询问您的服务器应该使用哪个URL。
经过一番思考后,我想我会在服务器上编译捆绑包。只需以编程方式生成var uploadImageObj = $('<img id="upload-img">');
uploadImageObj.attr('src', canvas.toDataURL());
uploadImageObj.appendTo('.template');
,并将属性设置为相关的url - 然后使用与通常相同的命令行进行编译(如果您使用的是Visual Studio,则应在构建日志中提供)。在您Bundle.wxs
中,添加以下内容:
Chain
有关<MsiPackage Id="MySoftware" SourceFile="$(var.Setup.TargetPath)" Vital="yes">
<MsiProperty Name="MyUrl" Value="URL_WRITTEN_BY_SERVER" />
</MsiPackage>
元素here的更多信息。
答案 1 :(得分:0)
我可以在这里找不到任何其他选项。我实际上最终用iexpress.exe重新包装了我的EXE(在处理这个问题之前我根本不知道存在)。我重新打包并使用覆盖服务器地址的命令行使包调用原始包。重新打包是作为服务器安装程序的自定义步骤完成的。