Upgrade a Windows Service without Uninstalling

19,964

Solution 1

I've done this with WiX, which generates .MSI files using the ServiceInstall & SeviceControl commands:

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

This stops the service, installs the new version and re-starts the service.

Solution 2

I do not use Visual Studio setup projects, so I might be wrong, but it seems it has no support for the ServiceInstall and ServiceControl tables which are standard features of Windows Installer. Those two tables are specially for installing and updating services....

Wix does support it (see this example), Maybe you can create a merge module, and use that in your project.

Otherwise this might help: Installing Services with Visual Studio (Phil Wilson)

Solution 3

Use sc tool from a command line to stop and start the service:

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

When the service is stopped, update the corresponding files and then start the service again. You should be able to do that from your installer as well. If you use Wix for your installer, then take a look at ServiceControl element.

Solution 4

Can't you just stop the service, and overwrite the service executable, and then restart the service?

Share:
19,964
Jonathan Allen
Author by

Jonathan Allen

Editor for InfoQ

Updated on June 09, 2022

Comments

  • Jonathan Allen
    Jonathan Allen almost 2 years

    Currently I have to uninstall the old version of my service before I install the new version. I am pretty sure this has something to do with it not being smart enough to update or remove the old service entries before adding the new ones.

    Is there a way to have the installer skip registering the service if it already exists? (I can assume the installation folder and service name do not change between versions.)

    Also, is there a way to automatically stop the service when uninstalling?


    Edit:

    I am using MSI packages and the Visual Studio setup project.