我基于文章WiX 3 Tutorial: Understanding main WXS and WXI file创建了一个WiX设置项目,主要是因为它提供了关闭应用程序所需的WiX。
然而,我对结果感到困惑。情况如下:
我们有一个可执行文件,它使用dll并创建一个安装可执行文件和dll的安装程序。我们执行设置。
案例1 :接下来,我们更改可执行文件而不是dll并再次创建安装程序。然后我们启动已安装的应用程序并确保加载了dll。如果我们现在执行第二次设置,则会显示一个对话框,要求用户按照我们的预期关闭可执行文件。
案例2 :但是如果我们不更改应用程序但只更改dll然后在应用程序运行时执行设置并且加载了dll,则不会显示任何对话框。在设置结束时,会出现一个对话框,询问我们是否要重新启动计算机。
这是预期的行为吗?如果在CASE 2中只改变了一个dll,我怎么能强制CASE 1的应用程序关闭对话框?我不希望用户必须重新启动计算机,因为应用程序正在无法重新启动的服务器上运行。
答案 0 :(得分:0)
这一切都由Windows Installer在成本核算过程中确定。安装程序决定需要安装/更新哪些文件,并计算需要多少磁盘空间以及是否存在任何文件锁定。如果存在文件锁定,它会尝试将锁定解析为具有窗口句柄的进程。如果它可以做到这一点,你将得到对话框。如果不能,你就不会。这并不意味着不需要重启,它无法为您提供有关如何避免重启的有用信息。
还有几点:
确保您正在对EXE和DLL进行版本控制。如果旧的DLL是1.0.0.0并且新的DLL是1.0.0.0,那么成本将会说“这里没什么可做的”。
EXE如何在运行时使用DLL?在整个过程中,它可能根本就没有锁定它。
了解MSI的重启行为可以通过使用REBOOT = ReallySuppress等属性来改变
以下是一些很好的文章:
答案 1 :(得分:0)
我没有检查过代码,但我认为正在发生的事情是CloseApplication操作没有运行,因为它看到exe没有改变。据我所知,你无法使用CloseApplication定位DLL。如果使用日志记录运行安装,则应该能够查看是否触发了操作。我假设您在安装后期安排了RemoveExistingProducts,如果您在InstallValidate之后移动它,它会每次都删除exe,从而触发操作。