为了防止这种行为,我实际上只需要在执行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
解决方法
造成这种情况的一个常见原因就是服务行为不当. Wait = yes不会永远等待,根据文档只有30秒.因此,服务必须响应控制消息,告诉它停止.即使服务“停止”并不意味着该过程已经消失,只是它不再作为服务运行.如果实际终止进程需要一段时间,那么Windows别无选择,只能显示正在使用的文件.这些事情很难调试,因为时间问题通常是,但如果是我,我会仔细检查服务关闭代码.
另请注意,在升级方案中您可能需要stop = both.如果InstallValidate(在您的传入升级中)没有在ServiceControl中看到安装停止并且正在使用文件,那么您将获得该文件在使用中的问题. InstallValidate没有预先看看何时可以运行RemoveExistingProducts,然后在另一个MSI中查找可能阻止正在使用的文件的ServiceControl.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。