我试图在我们的应用中进行机上更新。这意味着,我正在下载更新,呼叫msiexec
并在合理的时间内退出(少于一秒)。 MSI执行更新并通过调用传递给它的令牌的更新版本来恢复事务。如果我不更新主要的可执行文件,这实际上可以正常工作。
我遇到的问题是,即使调用应用程序退出相当快,并且MSI似乎需要一些时间才能实际更新文件,但主要可执行文件的更新将被延迟。我已将/noreboot
(和/passive
)传递给msiexec
,但这意味着该应用已被修复"下次推出时。但是,由于应用程序可以直接调用(而不是通过快捷方式),因此需要正确更新。
所以问题是,如何让Windows安装程序在检查它是否被锁定之前等待我的应用程序退出?
我现在正在思考我可以将进程ID传递给安装程序并进行等待此操作的自定义操作(dll?),但我想避免这种情况有两个原因:1)应用程序已经在那里,它不会通过进程ID和2)我想找到一个不需要我编写DLL的解决方案,如果可能的话。
我正在使用WiX创建MSI设置。
答案 0 :(得分:1)
也许这个解决方案有点实用,但不是从主要的可执行文件中启动msiexec,你可以编写一个小帮手工具。
你的主要可执行文件会调用这个帮助程序,它会休眠一两秒,然后在主应用程序关闭时调用msiexec。
另一种方法是使用Wix-Utils:
在命名空间中引用Util-schema:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
并对其进行配置以确保您的应用程序已关闭:
<util:CloseApplication Id="CloseApp" CloseMessage="yes" Target="MyApp.exe" RebootPrompt="no" />
有关所有选项的完整列表,请查看文档:
http://wixtoolset.org/documentation/manual/v3/xsd/util/closeapplication.html