我有一些麻烦可以在卸载服务时执行。我已将代码添加到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
谢谢, Sagar的
答案 0 :(得分:1)
你需要更清楚地了解你所做的一切。例如,除非将它们显式添加到您的设置中作为自定义操作(在您的情况下是卸载自定义操作),否则不会自动调用安装程序类方法。您还应该准确解释服务的安装方式。
请注意,安装程序类是由Visual Studio安装程序发明的,通常不需要使用它们,因为像InstallShield这样的工具通常支持Windows Installer中的标准ServiceInstall和ServiceControl功能。安装程序类是不必要的。此外,这些事件是Visual Studio特价,我不清楚InstallShield是否支持它们。如果您使用卸载方法卸载服务,则只需在Base.Uninstall()调用之前添加“之前”代码。
如果您希望在卸载服务时运行代码,更常见的方法是使用自定义操作调用您的代码,并调整REMOVE =“ALL”(用于卸载)或其他条件的调用,具体取决于你的确切要求。例如,如果您升级MSI以升级现有产品,您仍然希望运行该卸载代码吗?
答案 1 :(得分:0)
.NET安装程序类 :PhilDW已经说了一切,但我只是想添加一些东西。我假设您使用的是System.Configuration.Install.Installer
和ServiceProcessInstaller Class(有a sample in the Installshield help file)。曾经(并且我认为仍然存在)每个名为.NET Installer Class
的Installshield组件的标志。您可以将此标志设置为Yes
,然后我相信Installshield本身将负责运行您的安装程序类方法(安装,提交,回滚,卸载 - 无论哪个实现,我认为,但我从未测试过所有方案我没有使用这个功能。
InstallUtil.exe :运行InstallUtil.exe
确实会调用这些方法。我不确定Installshield如何调用引擎盖下的方法(在设置执行期间) - 他们实际上可能正在调用InstallUtil.exe
我所知道的,或者更低级别的API调用。
结论 :只需转到组件视图,然后点击包含service.exe
文件的组件 - 并设置标记上文提到的。 exe必须是相关组件的密钥文件 - 它必须是.NET程序集。 就像PhilDW写的那样,我不会使用这些方法,因为它们仅用于服务开发 - 而不是在部署期间。首先,当方法尝试运行错误整个设置时(通常不必要地),可能会遇到运行时错误,并且还可能存在回滚和<的问题强>潜在的其他问题。 我们可以问这些方法实际上在做什么吗?也许您只是删除了一些日志文件?还有其他方法可以做到这一点 - 最重要的是使用RemoveFile table。