微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WiX:在RemoveExistingProducts之前停止服务或运行提升的CustomAction以在RemoveExistingProducts之前停止进程

我在重大升级时遇到了问题.安装程序包含一项服务,在升级时我得到一个弹出窗口,说明需要重新启动才能完成安装过程.

为了防止这种行为,我实际上只需要在执行RemoveExistingProducts(而不是InstallValidate)之前停止服务.

MajorUpgrade放在InstallInitialize之后,包中的InstallPrivileges =“elevated”.

我有两个案例:

案例1:服务由ServiceInstall安装

<Component Id="myservice_Service" Guid="*">
            <File Id="myservice.exe" KeyPath="yes" Vital="yes"
                  Source="SourceDir\bin\myservice.exe"/>
            <ServiceInstall Id="myservice_ServiceInstall" Type="ownProcess"
                            Vital="yes" Name="myservice" displayName="myservice Service"
                            Description="myservice Service" Start="auto" Account=".\LocalSystem"
                            ErrorControl="ignore" Interactive="no" Arguments="--run"/>
            <ServiceControl Id="myservice_ServiceControl" Name="myservice" Wait="yes" Stop="uninstall"/>
        </Component>

调用InstallValidate之前,ServiceControl不会停止服务.即使说Stop =“both”.所以弹出窗口出现了.请注意,安装程序不会启动该服务.

我发现的合理帖子(摘录):

> How does one stop a Windows service to do an upgrade install?
> Upgrade a Windows Service without Uninstalling

案例2:服务由CustomAction安装(有一些原因可以解释为什么不通过ServiceInstall进行).
在这种情况下,我必须调用可执行文件来停止服务(“myservice.exe –stop”).为此,它变得棘手,因为由于ICE63,在调用RemoveExistingProducts之前不允许安排CustomAction.那么,我怎么能实现这个呢?

到目前为止,我已阅读过以下帖子:

> WiX call app on uninstall before User prompt “close manually”
> WiX close application before uninstall – close open applications message
> Close a systemtray app before uninstalling using wix
> http://t53456.windows-development-wix-user.wintalk.us/stop-a-service-before-uninstall-t53456.html

bootstrapper exe是没有选择的,因为我需要生成一个普通的MSI.

在这里找到了类似的未解答的问题:Wix Installer Problem: Why does RestartManager mark Service as RMCritical and not RMService

解决方法

InstallValidate之后的ServiceControl顺序无关紧要.如果在InstallValidate中检测到服务的文件正在使用情况,但服务在ServiceControl表中在卸载时停止,则Windows会合理地推迟使用任何文件情况以查看实际发生的情况.如果你从ServiceControl中取出它,你将失去这个潜在有用的功能.请注意,您可以独立于ServiceInstall使用ServiceControl – 它们不绑定在一起,因此如果服务可以很好地与ServiceControl一起使用,则不一定需要运行exe来停止服务.

造成这种情况的一个常见原因就是服务行为不当. Wait = yes不会永远等待,根据文档只有30秒.因此,服务必须响应控制消息,告诉它停止.即使服务“停止”并不意味着该过程已经消失,只是它不再作为服务运行.如果实际终止进程需要一段时间,那么Windows别无选择,只能显示正在使用的文件.这些事情很难调试,因为时间问题通常是,但如果是我,我会仔细检查服务关闭代码.

另请注意,在升级方案中您可能需要stop = both.如果InstallValidate(在您的传入升级中)没有在ServiceControl中看到安装停止并且正在使用文件,那么您将获得该文件在使用中的问题. InstallValidate没有预先看看何时可以运行RemoveExistingProducts,然后在另一个MSI中查找可能阻止正在使用的文件的ServiceControl.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐