【发布时间】:2018-03-05 19:51:06
【问题描述】:
Wix 3.10.3,安装程序是一个自定义引导程序,包装了一个 msi。我已经实现了安装/卸载和修改功能。
MSI 安装了几个服务,其中至少一个与 PCI 驱动程序接口 - 当我添加或删除 PCI 组件时,我需要停止并重新启动与所述组件接口的服务,以防止可怕的“必须重新启动”场景。
我发现我可以在安装驱动程序的组件中添加一个ServiceControl元素,但是,它也会在卸载应用程序时启动服务。
我读到了一些关于“共享组件”的提及,尽管没有太多关于它的文档,这表明这将是在这类情况下要走的路。
<Fragment>
<Component Id="PCIDriver_SvcCtl" Directory="INSTALLDIR" Guid="{5EAB2128-228D-44BE-950F-5F258B94BFED}" Win64="$(var.Win64)" >
<CreateFolder/>
<!-- Any action but uninstall. -->
<Condition>NOT REMOVE~="ALL"</Condition>
<ServiceControl Id="Service1_SvcCtl" Name="service1" Start="both" Stop="both" Wait="no" />
<ServiceControl Id="Service2_SvcCtl" Name="service2" Start="both" Stop="both" Wait="no" />
</Component>
</Fragment>
然后,在我的 Product.wxs 中,对于需要此功能(安装 PCI 驱动程序)的功能,我添加了:
<ComponentRef Id="PCIDriver_SvcCtl" />
可能与我的问题无关,但与重启管理器相关,我在 Product.wxs 中设置了以下重启管理器属性:
<Property Id="MSIRMSHUTDOWN" Value="1" />
所以,当我通过修改添加/删除 PCI 驱动程序时,我的组件运行,停止然后启动服务,但是,当我卸载整个应用程序时它也会运行。由于有两个服务,当它们被删除并调用它来启动它们时,它会增加两分钟的卸载时间(因为尝试重新启动两次,每次等待时间为 30 秒)。
我需要设置什么条件来避免在 MSI 卸载时调用此组件,但允许它在修改期间运行?或者,我是否需要以不同的方式创作它?谢谢!
【问题讨论】:
标签: wix windows-services windows-installer wix3.10