如何使用 MSI 软件包卸载 topshelf 服务?
How do you uninstall a topshelf service with an MSI package?
我有几个使用 topshelf 开发的服务,这些服务是使用在 InstallShield 中创建的 MSI(使用基本 MSI)安装的。我们使用传递安装参数的自定义操作来安装它们。在卸载时,我们使用传递卸载参数的自定义操作(我们也有根据需要启动和停止的自定义操作)。所有这一切都有效,但用户会看到一个对话框,要求他们关闭这些服务,否则可能需要重新启动。但是,如果用户选择继续,我们的自定义操作将运行,停止并卸载服务。
我一直无法在执行序列中将停止操作移动到足够高的位置来避免对话,同时又不会导致不在事务中的错误。
有什么方法可以去掉那个对话框吗?
要使用自定义操作停止服务,您需要在 InstallValidate 之前执行它,这意味着它必须是即时的,因此如果安装被取消或失败,它会变得棘手,因为这样您就会让系统停止服务。
真正的解决方案是您应该使用 ServiceInstall 元素安装服务,并 stop/start/delete 使用 ServiceControl 元素安装它们。在卸载时,如果 Windows 安装程序发现您要停止服务(使用 ServiceControl),那么它不会执行 FilesInUse 对话框。
所以简短的回答是您可能根本不需要自定义操作。 ServiceControl 元素可用于停止和启动所有服务(而不仅仅是使用 ServiceInstall 安装的服务),因此如果您执行 ServiceControl 元素以在卸载时停止服务,它可能会解决问题。从长远来看,我会放弃命令行安装并使用 ServiceInstall。
我有几个使用 topshelf 开发的服务,这些服务是使用在 InstallShield 中创建的 MSI(使用基本 MSI)安装的。我们使用传递安装参数的自定义操作来安装它们。在卸载时,我们使用传递卸载参数的自定义操作(我们也有根据需要启动和停止的自定义操作)。所有这一切都有效,但用户会看到一个对话框,要求他们关闭这些服务,否则可能需要重新启动。但是,如果用户选择继续,我们的自定义操作将运行,停止并卸载服务。
我一直无法在执行序列中将停止操作移动到足够高的位置来避免对话,同时又不会导致不在事务中的错误。
有什么方法可以去掉那个对话框吗?
要使用自定义操作停止服务,您需要在 InstallValidate 之前执行它,这意味着它必须是即时的,因此如果安装被取消或失败,它会变得棘手,因为这样您就会让系统停止服务。
真正的解决方案是您应该使用 ServiceInstall 元素安装服务,并 stop/start/delete 使用 ServiceControl 元素安装它们。在卸载时,如果 Windows 安装程序发现您要停止服务(使用 ServiceControl),那么它不会执行 FilesInUse 对话框。
所以简短的回答是您可能根本不需要自定义操作。 ServiceControl 元素可用于停止和启动所有服务(而不仅仅是使用 ServiceInstall 安装的服务),因此如果您执行 ServiceControl 元素以在卸载时停止服务,它可能会解决问题。从长远来看,我会放弃命令行安装并使用 ServiceInstall。