正在进行更新 - 如何使MSI在更新之前等待可执行文件退出?

时间:2015-11-27 15:31:29

标签: wix windows-installer

我试图在我们的应用中进行机上更新。这意味着,我正在下载更新,呼叫msiexec并在合理的时间内退出(少于一秒)。 MSI执行更新并通过调用传递给它的令牌的更新版本来恢复事务。如果我不更新主要的可执行文件,这实际上可以正常工作。

我遇到的问题是,即使调用应用程序退出相当快,并且MSI似乎需要一些时间才能实际更新文件,但主要可执行文件的更新将被延迟。我已将/noreboot(和/passive)传递给msiexec,但这意味着该应用已被修复"下次推出时。但是,由于应用程序可以直接调用(而不是通过快捷方式),因此需要正确更新。

所以问题是,如何让Windows安装程序在检查它是否被锁定之前等待我的应用程序退出?

我现在正在思考我可以将进程ID传递给安装程序并进行等待此操作的自定义操作(dll?),但我想避免这种情况有两个原因:1)应用程序已经在那里,它不会通过进程ID和2)我想找到一个不需要我编写DLL的解决方案,如果可能的话

我正在使用WiX创建MSI设置。

1 个答案:

答案 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