【问题标题】:Cancelling a Windows service installation/Uninstallation with the Windows Installer causes service to be incompletely installed/uninstalled使用 Windows Installer 取消 Windows 服务安装/卸载会导致服务安装/卸载不完整
【发布时间】:2018-10-30 09:33:42
【问题描述】:

我使用 VS 2017 为 Windows 服务创建了一个 Windows 安装程序。Windows 服务内部有一个项目安装程序和服务安装程序类。当我中途取消卸载过程时,该过程会删除 windows 服务但不会更新数据,所以下次我运行 setup 时,我可以选择修复或卸载 windows 服务。现在尝试卸载 Windows 服务会出现“指定服务不存在”的错误,因此卸载过程会回滚。现在系统处于既不能安装也不能卸载服务的状态。为了能够完全删除该服务,必须从命令行再次安装它,以便可以正确卸载它。有没有办法解决这个问题?我曾想过使用服务安装表来确保即使在取消时也能正确删除服务,但是在尝试安装服务时我得到了服务已经安装的错误[项目安装程序/服务安装程序类执行此安装,我认为]

【问题讨论】:

    标签: windows service windows-installer visual-studio-setup-proje


    【解决方案1】:

    MSVS 安装程序和自定义操作:您使用的是Microsoft Visual Studio 2017 Installer Projects它们非常有限。对服务安装使用自定义操作是其中一个症状。一般来说,自定义操作的使用是a very error prone approach(可能是夸大其词),对于服务安装来说,它几乎从来都不是正确的方法。尽可能摆脱自定义操作,您的部署失败率将会下降。

    内置服务安装功能:您应该使用 Windows Installer 的内置服务安装功能(ServiceInstallServiceControl 表 - 您似乎熟悉),并且有许多工具可以帮助您做到这一点。 Here are some alternative tools (free and commercial) that you can use。 WiX 做得很好,但确实有一个学习曲线。


    服务状态:在你的情况下,我会重新启动,以摆脱服务当前的错误状态。它可能处于某种奇怪的状态等待删除,这可能会导致奇怪的测试结果。我从不花时间正确调查此类问题,而是更愿意尝试通过简单的重新启动来消除它们以摆脱错误状态。然后使用内置功能正确进行部署,并且永远不会出现错误状态。去掉一个问题就解决了十个问题? (一厢情愿:-))。


    【讨论】:

    • 感谢 Stein。我能否在不使用自定义操作的情况下运行 ProjectInstaller 和 ServiceInstaller 类中的代码?我需要它才能在服务器上正确注册应用程序 [我在卸载时进行 Web 服务调用]。或者除了 ProjectInstaller/ServiceInstaller 类[迫使我使用自定义操作]]在安装或卸载时运行自定义代码之外还有其他的吗?
    • 自定义操作(各种类型 - 二进制文件、脚本、dll 等)是在部署期间运行自定义代码的可用构造。 Custom actions are error prone - 部署失败的主要原因。我对需要从 MSI 设置中进行网络访问的代码特别怀疑——整个技术的设计从未考虑到网络(MSI 已有 20 多年的历史——从软盘时代开始)。在静默模式下,整个安装在系统上下文中运行,然后网络访问就会出现问题。
    【解决方案2】:

    首先确保您已完成所有自定义操作服务安装程序节点,特别是填充了提交和回滚节点自定义操作。这些自定义操作都可以协同工作,因此如果您错过了其中一个可能会导致问题的操作。理论上取消卸载应该已经注意到服务不再安装了,应该重新安装。

    如果这不是问题,那么它可能是一个错误。修复它最有用的方法是在安装程序类中覆盖 base.Uninstall() 并添加一些代码以在调用 base.Uninstall() 之前检查服务是否实际安装。

    Visual Studio 安装项目是唯一使用代码安装服务的项目,它们是调用安装程序类方法的自定义操作。其他人都使用 Windows Installer 提供的 ServiceInstall 和 ServiceControl 表。

    如果您不想完全切换到其他工具(例如 WiX),可以使用以下选项:

    1. 如果您对服务有所了解,ServiceControl 和 ServiceInstall 表就不会太复杂。如果您从此处向下滚动到有关 Visual Studio 和安装服务的段落,则有一篇文章和一个程序可以帮助您:

    http://www.installsite.org/pages/en/msi/tips.htm

    1. 您可以深入了解 WiX 以创建一个合并模块来安装服务以及所需的任何启动/停止操作。然后将该合并模块合并到您的 Visual Studio 设置中。不需要自定义操作(安装类是自定义操作,因此您不需要它们)。

    【讨论】:

    • 非常感谢 PhilDW。我都做了。添加自定义操作以回滚和提交,以及 ii.添加代码以在调用 base.Uninstall 之前检查服务是否存在。成功了。
    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    相关资源
    最近更新 更多