我有几个使用topshelf开发的服务,这些服务是使用在InstallShield中创建的MSI安装的(使用基本的MSI)。我们使用传递install参数的自定义操作来安装它们。在卸载时,我们使用传递uninstall参数的自定义操作(我们还有适当的自定义操作启动和停止)。所有这一切都有效,但是会向用户显示一个对话框,要求他们关闭这些服务,否则可能需要重新启动。但是,如果用户选择继续,我们的自定义操作将运行,停止和卸载服务。
我无法在执行序列中将停止操作移动得足够高,以避免对话而不会导致非事务错误。
有什么方法可以摆脱那个对话吗?
答案 0 :(得分:2)
要使用自定义操作停止服务,您需要在InstallValidate之前使用它,这意味着它必须是立即的,因此如果安装被取消或失败会变得棘手,因为这会使系统停止服务。
对此的真正解决方案是您应该使用ServiceInstall元素安装服务,并使用ServiceControl元素停止/启动/删除它们。在卸载时,如果Windows Installer发现您要停止服务(使用ServiceControl),则它不会执行FilesInUse对话框。
所以简短的回答是你根本不需要自定义动作。 ServiceControl元素可用于停止和启动所有服务(不仅仅是使用ServiceInstall安装的服务),因此如果您执行ServiceControl元素以在卸载时停止服务,则可能会解决问题。从长远来看,我将远离命令行安装并使用ServiceInstall。