目前我必须在安装新版本之前卸载旧版本的服务。我很确定这与它不够聪明,无法在添加新服务条目之前更新或删除旧服务条目有关。
如果服务已经存在,有没有办法让安装程序跳过注册服务?(我可以假设安装文件夹和服务名称在版本之间不会改变。)
另外,有没有办法在卸载时自动停止服务?
编辑:
我正在使用 MSI 包和 Visual Studio 安装项目。
目前我必须在安装新版本之前卸载旧版本的服务。我很确定这与它不够聪明,无法在添加新服务条目之前更新或删除旧服务条目有关。
如果服务已经存在,有没有办法让安装程序跳过注册服务?(我可以假设安装文件夹和服务名称在版本之间不会改变。)
另外,有没有办法在卸载时自动停止服务?
我正在使用 MSI 包和 Visual Studio 安装项目。
我已经使用 WiX 完成了此操作,它使用 ServiceInstall 和服务控制命令生成 .MSI 文件:
<Component Id='c_WSService' Guid='*'>
<File Id='f_WSService' Name='WSService.exe' Vital='yes' Source='..\wssvr\release\wsservice.exe' KeyPath="yes" />
<ServiceInstall Id='WSService.exe' Name='WSService' DisplayName='[product name]' Type='ownProcess'
Interactive='no' Start='auto' Vital='yes' ErrorControl='normal'
Description='Provides local and remote access to [product name] search facilities.' />
<ServiceControl Id='WSService.exe' Name='WSService' Start='install' Stop='both' Remove='uninstall' Wait='yes' />
</Component>
这将停止服务,安装新版本并重新启动服务。
我不使用 Visual Studio 安装项目,所以我可能错了,但它似乎不支持作为 Windows Installer 标准功能的 ServiceInstall 和 ServiceControl 表。这两个表专门用于安装和更新服务....
Wix确实支持它(见这个例子),也许你可以创建一个合并模块,并在你的项目中使用它。
否则这可能会有所帮助:Installing Services with Visual Studio (Phil Wilson)
从命令行使用sc工具停止和启动服务:
sc stop {name of your service}
sc start {name of your service}
当服务停止时,更新相应的文件,然后重新启动服务。您也应该能够从安装程序中做到这一点。如果您在安装程序中使用Wix,请查看ServiceControl元素。
你不能停止服务,覆盖服务可执行文件,然后重新启动服务吗?
您可以制作单独的 DLL,该服务将在每次工作时加载和调用。确保该服务在使用后卸载 DLL。
使用时应将其加载到单独的应用程序域中。
我的 hacky 解决方案是修改ProjectInstaller.vb
文件,使其发出停止和删除服务的命令,然后暂停一下。从安装的角度来看可能不如修改msi
文件那么整洁,但对于继承我的代码的人来说更具可读性/逻辑性。
请注意,该RunCommandCom
位是从如何从 VB.NET 运行 DOS/CMD/命令提示符命令?
将此方法与如何在安装后自动启动服务的代码结合使用?您可以获得所需的服务安装体验 - 一种自动安装和启动的服务,如果有一个当前正在运行的服务,则会覆盖该服务。
'This works. It leaves the MSI in a state that tells you to reboot the PC, but you really don't need to.
Private Sub ProjectInstaller_BeforeInstall(sender As Object, e As System.Configuration.Install.InstallEventArgs) Handles Me.BeforeInstall
Dim sEchoMessage As String = String.Empty
sEchoMessage &= " & ECHO ****************** Please be patient *******************************"
sEchoMessage &= " & ECHO Pausing to stop and delete the previous version of the following service:"
sEchoMessage &= " & ECHO " & ServiceInstaller1.ServiceName
sEchoMessage &= " & ECHO -------------------------------------------------------------------------------"
sEchoMessage &= " & ECHO After install is complete, you may see a message that says you need to reboot."
sEchoMessage &= " & ECHO You may IGNORE this message - The service will be installed and running."
sEchoMessage &= " & ECHO There is NO Reboot required."
sEchoMessage &= " & ECHO *******************************************************************************"
RunCommandCom("sc stop " & ServiceInstaller1.ServiceName & " & sc delete " & ServiceInstaller1.ServiceName & sEchoMessage, 15000)
End Sub
Private Sub RunCommandCom(command As String, mSecSleepAfterExecution As Integer)
Using p As Process = New Process()
Dim pi As ProcessStartInfo = New ProcessStartInfo()
pi.Arguments = " /K " + command
pi.FileName = "cmd.exe"
p.StartInfo = pi
p.Start()
System.Threading.Thread.Sleep(mSecSleepAfterExecution)
p.CloseMainWindow()
End Using
End Sub