经过太多的实验,我得出的结论是Windows Installer简直是糟糕的技术。但是客户想要MSI文件。
因此,如何创建一个将EXE文件提取到临时目录并使用与传递给EXE文件相同或相似的选项运行它的MSI文件?
Moji的选项在Msiexec (command-line options)中进行了说明(MSI的低级“运行”是msiexec option package.msi)。
编辑:mjmarsh的WiX解决方案看起来像它的作品。我只是还没有机会尝试(锻炼时间)。如果有效,我会接受。
编辑:它不起作用。缺少的部分:有人看管/没有人看管。
无论如何,使这项工作唯一可行的唯一办法就是使用自定义操作杀死其父进程!
编辑:所以有人发布了进一步的答案,将整个内容包装为安装后的自定义操作。从理论上讲可能,但是由于可能需要重新启动(感谢MS for .NET 4有时需要重新启动),因此我们必须进行进一步的黑客攻击。因此,从优势矩阵来看:
Transparency: No. One big custom action.
Customizability: No.
Standardization: No.
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.
没有意义。
最佳答案
添加到weir's
答案中,如下所示更改custom action attribute
:
<!--Run Action-->
<CustomAction Id="RunWrappedExe"
Return="asyncNoWait"
FileKey="ApplicationFileId"
Execute="deferred"
ExeCommand=""
HideTarget="no"
Impersonate="yes"/>
设置
Return=asyncNoWai
不会等待exe
返回。安装程序完成工作并正常关闭。同时,exe
继续执行。-马杜雷什
关于installation - 如何制作仅包装EXE文件的MSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/854873/