飞行中更新 - 如何让 MSI 在更新前等待可执行文件退出?
In-flight update - How to make MSI wait for the executable to exit before updating?
我正在尝试在我们的应用程序中进行动态更新。这意味着,我正在下载更新,调用 msiexec
并在合理的时间内(不到一秒)退出。 MSI 通过使用传递给它的令牌调用更新版本来执行更新并恢复事务。如果我不更新主可执行文件,这实际上工作正常。
我遇到的问题是,即使调用应用程序退出得相当快并且 MSI 似乎需要一些时间才能真正更新文件,但主可执行文件的更新被推迟了。我将 /noreboot
(和 /passive
)传递给 msiexec
,但这意味着该应用程序在下次启动时为 "repaired"。但是,由于应用程序可以直接调用(而不是通过快捷方式),因此需要正确更新它。
所以问题是,如何让 windows 安装程序等待我的应用程序退出,然后再检查它是否被锁定?
我现在在想我可以将进程 ID 传递给安装程序并有一个自定义操作(dll?)等待它,但我想避免这种情况有两个原因:1) 应用程序已经在那里,它不会传递进程 ID 和 2) 我想找到一个不需要我编写 DLL 的解决方案,if possible.
我正在使用 WiX 创建 MSI 设置。
也许这个解决方案有点实用,但您可以编写一个小帮助工具,而不是从您的主要可执行文件启动 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
我正在尝试在我们的应用程序中进行动态更新。这意味着,我正在下载更新,调用 msiexec
并在合理的时间内(不到一秒)退出。 MSI 通过使用传递给它的令牌调用更新版本来执行更新并恢复事务。如果我不更新主可执行文件,这实际上工作正常。
我遇到的问题是,即使调用应用程序退出得相当快并且 MSI 似乎需要一些时间才能真正更新文件,但主可执行文件的更新被推迟了。我将 /noreboot
(和 /passive
)传递给 msiexec
,但这意味着该应用程序在下次启动时为 "repaired"。但是,由于应用程序可以直接调用(而不是通过快捷方式),因此需要正确更新它。
所以问题是,如何让 windows 安装程序等待我的应用程序退出,然后再检查它是否被锁定?
我现在在想我可以将进程 ID 传递给安装程序并有一个自定义操作(dll?)等待它,但我想避免这种情况有两个原因:1) 应用程序已经在那里,它不会传递进程 ID 和 2) 我想找到一个不需要我编写 DLL 的解决方案,if possible.
我正在使用 WiX 创建 MSI 设置。
也许这个解决方案有点实用,但您可以编写一个小帮助工具,而不是从您的主要可执行文件启动 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