【问题标题】:How to get MSI Installer to run some code on uninstall of a service如何让 MSI 安装程序在卸载服务时运行一些代码
【发布时间】:2018-05-02 09:46:00
【问题描述】:

我遇到了一些问题,我想在服务被卸载时执行。我已将代码添加到 System.ServiceProcess.ServiceProcessInstaller BeforeUninstall 事件和
到覆盖方法 OnBeforeUninstall,但这也不起作用。

当使用我的 InstallShield msi 卸载服务时,此代码不会被执行。

如何强制服务在卸载期间启动某些代码?我需要在我的 C# 服务中使用不同的事件吗?我需要更改 MSI 中的某些内容吗?

注意: 我的问题与以下相同 https://community.flexerasoftware.com/showthread.php?149176-MSI-Uninstall-NET-Service-does-not-launch-BeforeUninstall-event

谢谢, 萨格尔

【问题讨论】:

    标签: windows service windows-installer installshield


    【解决方案1】:

    您需要更明确地说明您所做的一切。例如,安装程序类方法不会自动调用,除非它们作为自定义操作显式添加到您的设置中(在您的情况下是卸载自定义操作)。您还应该准确解释服务是如何安装的。

    请注意,安装程序类是由 Visual Studio 设置发明的,通常不需要使用它们,因为像 InstallShield 这样的工具通常支持 Windows Installer 中的标准 ServiceInstall 和 ServiceControl 功能。安装程序类是不必要的。此外,这些事件是 Visual Studio 的特殊事件,我不清楚 InstallShield 是否支持它们。如果您使用 Uninstall 方法来卸载服务,那么只需将“之前”代码添加到 Base.Uninstall() 调用之前。

    如果您希望在卸载服务时运行代码,更常用的方法是使用自定义操作来调用您的代码,并将调用设置为 REMOVE="ALL"(用于卸载)或其他条件,具体取决于你的确切要求。例如,如果您执行升级 MSI 以升级现有产品,您是否仍要运行该卸载代码?

    【讨论】:

    • 我使用服务安装和服务控制表来安装和启动服务。我可以使用自定义操作,但这会涉及 Windows 服务中的代码重复。我正在尝试调用 Web 服务方法以在卸载时取消注册应用程序。我不想在升级时调用该代码。
    【解决方案2】:

    .NET 安装程序类:PhilDW 已经说了这么多,但我只想补充几点。我假设您使用的是System.Configuration.Install.InstallerServiceProcessInstaller Class(有a sample in the Installshield help file)。曾经(我认为仍然存在)每个 Installshield 组件都有一个名为 .NET Installer Class 的标志。您可以将此标志设置为Yes,然后我相信 Installshield 本身将负责运行您的安装程序类方法(安装、提交、回滚、卸载 - 我认为实现的任何一个,但我从未测试过所有场景。我不要使用此功能)。

    InstallUtil.exe:运行InstallUtil.exe 确实会调用这些方法。我不确定 Installshield 如何在后台调用这些方法(在设置执行期间)——据我所知,它们实际上可能正在调用 InstallUtil.exe,或者是一些更底层的 API 调用。

    结论:只需转到组件视图并单击包含您的service.exe 文件的组件 - 并设置上述标志. exe 必须是相关组件的密钥文件 - 并且必须是 .NET 程序集。 就像 PhilDW 写的那样,我不会使用这些方法,因为它们只打算在服务开发期间使用,而不是在部署期间使用。一方面,当方法尝试运行使您的整个设置出错时,您可能会遇到 运行时错误(通常是不必要的),并且 回滚 也可能存在问题strong>潜在的其他问题我们能问一下这些方法实际上在做什么吗?也许您只是在删除一些日志文件?还有其他方法可以做到这一点 - 最重要的是使用 RemoveFile table

    【讨论】:

    • 我正在尝试调用 Web 服务方法以在卸载时取消注册应用程序。用户可能会卸载应用程序并忘记在服务器上注销它。我可以为处理失败场景的方法设置异常处理程序
    • 我很抱歉说 Installshield。我实际上是指 VS 安装程序向导。我无法弄清楚组件视图在哪里。在 orca 中,有一个组件表,包含列属性和条件。你是这个意思吗?还是安装向导项目中的某些内容?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多