restaurar restablecer punto programas perder formatear fabrica este equipo desde borrar arranque archivos anterior .net windows-services windows-installer

.net - restablecer - Actualice un servicio de Windows sin desinstalar



restaurar windows 10 de fabrica desde arranque (6)

Actualmente tengo que desinstalar la versión anterior de mi servicio antes de instalar la nueva versión. Estoy bastante seguro de que esto tiene algo que ver con que no es lo suficientemente inteligente como para actualizar o eliminar las antiguas entradas del servicio antes de agregar las nuevas.

¿Hay alguna manera de evitar que el instalador registre el servicio si ya existe? (Puedo asumir que la carpeta de instalación y el nombre del servicio no cambian entre versiones).

Además, ¿hay alguna manera de detener automáticamente el servicio al desinstalar?

Editar:

Estoy usando paquetes MSI y el proyecto de instalación de Visual Studio.


Lo hice con WiX, que genera archivos .MSI con los comandos ServiceInstall & SeviceControl:

<Component Id=''c_WSService'' Guid=''*''> <File Id=''f_WSService'' Name=''WSService.exe'' Vital=''yes'' Source=''../wssvr/release/wsservice.exe'' /> <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>

Esto detiene el servicio, instala la nueva versión y reinicia el servicio.


¿No puede simplemente detener el servicio, sobrescribir el ejecutable del servicio y luego reiniciar el servicio?


No uso proyectos de instalación de Visual Studio, así que podría estar equivocado, pero parece que no tiene soporte para las tablas ServiceInstall y ServiceControl, que son características estándar de Windows Installer. Esas dos tablas son especialmente para instalar y actualizar servicios ....

Wix lo admite ( ver este ejemplo ). Tal vez pueda crear un módulo de fusión y usarlo en su proyecto.

De lo contrario, esto podría ayudar: Instalar servicios con Visual Studio (Phil Wilson)



Use la herramienta sc desde una línea de comando para detener e iniciar el servicio:

sc stop {name of your service} sc start {name of your service}

Cuando se detiene el servicio, actualice los archivos correspondientes y luego reinicie el servicio. Debería poder hacer eso desde su instalador también. Si usa Wix para su instalador, entonces eche un vistazo al elemento ServiceControl .


Mi solución hacky es modificar el archivo ProjectInstaller.vb por lo que emite un comando para detener y eliminar el servicio y luego pausa un poco. Probablemente no sea tan limpio desde una perspectiva de instalación como la modificación del archivo msi , pero mucho más legible / lógico para quien herede mi código.

Tenga en cuenta que el bit RunCommandCom está literalmente descifrado de ¿Cómo ejecutar comandos DOS / CMD / Command Prompt desde VB.NET?

¿Utiliza este método combinado con el código de Cómo iniciar automáticamente su servicio después de la instalación? puede tener la experiencia de instalación del servicio que desea: un servicio que se instala e inicia automáticamente, y sobrescribirá un servicio actualmente en ejecución, si lo hay.

''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