Windows 安装程序包 (.MSI) 是 OLE/COM 结构化存储。Microsoft 提供了一个 Win32 API (MSI.dll) 和一个 COM 自动化接口 ("WindowsInstaller.Installer")。
在 Unix 上,大部分 Win32 API 已被移植到 Wine。
现在我从来没有这样做过,但我看到了一些很有希望的东西。有一个名为OpenMCDF的开源项目。它是用 Visual Studio / .NET 编写的,但声称它支持 Mono。其中有一个测试应用程序(文档资源管理器),当你说 File | 打开它显示 .MSI 作为下拉选项,所以他们至少在考虑它。
无论如何,在源代码中,我看到了流和存储的类。准备好 MSI,您会发现文件被压缩到(Microsoft)CAB 档案中,并通过将其插入流中嵌入到 MSI 中。
在这种情况下,我可能会使用更新的 XML 文件创建一个新的文件柜,将其记录在媒体表中并更新文件表以反映新的序列号、文件大小和媒体 ID。
对于 MSI 专家来说,这在 C# 中是微不足道的。对于 .NET 专家来说,这真的很难。对于那些既不想在 CentOS 上用 PHP 做这件事的人……祝你好运。
另一种方法是使用未压缩的文件构建 MSI,然后将其用作模板来覆盖文件并构建自解压 EXE。这对你来说可能会容易得多。只需确保 MSI 和 XML 被缓存以进行修复事务。
或者只是设置一个 Windows 服务器并将构建传递给它并在完成后将其取回。