Подтвердить что ты не робот

Обновление службы Windows без удаления

В настоящее время мне нужно удалить старую версию моей службы, прежде чем устанавливать новую версию. Я уверен, что это связано с тем, что он недостаточно умен, чтобы обновлять или удалять старые служебные записи перед добавлением новых.

Есть ли способ, чтобы программа установки не регистрировала службу, если она уже существует? (Я могу предположить, что папка установки и имя службы не изменяются между версиями.)

Кроме того, есть ли способ автоматически остановить службу при удалении?


Edit:

Я использую пакеты MSI и проект установки Visual Studio.

4b9b3361

Ответ 1

Я сделал это с помощью WiX, который генерирует файлы .MSI с помощью команд ServiceInstall & SeviceControl:

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

Это останавливает службу, устанавливает новую версию и перезапускает службу.

Ответ 2

Используйте инструмент sc из командной строки, чтобы остановить и запустить службу:

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

Когда служба остановлена, обновите соответствующие файлы и снова запустите службу. Вы также сможете это сделать у своего установщика. Если вы используете Wix для своего установщика, взгляните на ServiceControl.

Ответ 3

Я не использую проекты установки Visual Studio, поэтому я могу ошибаться, но, похоже, он не поддерживает таблицы ServiceInstall и ServiceControl, которые являются стандартными функциями установщика Windows. Эти две таблицы специально предназначены для установки и обновления сервисов....

Wix поддерживает его (см. этот пример). Возможно, вы можете создать модуль слияния и использовать его в своем проекте.

В противном случае это может помочь: Установка служб с помощью Visual Studio (Phil Wilson)

Ответ 4

Не можете ли вы просто остановить службу и перезаписать исполняемый файл службы, а затем перезапустить службу?

Ответ 5

Вы можете создать отдельную DLL, которая будет загружаться и вызываться каждый раз, когда она выполняет свою работу. Убедитесь, что служба выгружает DLL после использования.

Использование должно загружать его в отдельный домен приложения.

SO http://msdn.microsoft.com/en-us/library/c5b8a8f9.aspx

Ответ 6

Мое взломанное решение состоит в том, чтобы изменить файл ProjectInstaller.vb, чтобы он выдавал команду для остановки и удаления службы, а затем немного приостанавливал. Вероятно, не так аккуратно с точки зрения установки, как изменение файла msi, но гораздо более удобочитаемый/логичный для того, кто наследует мой код.

Обратите внимание, что бит RunCommandCom сглажен из Как выполнить команды DOS/CMD/Command Prompt с VB.NET?

Используя этот метод в сочетании с кодом из Как автоматически запустить службу после установки? у вас может быть необходимый сервис установки - служба, которая устанавливается и запускается автоматически, и будет перезаписывать текущую службу, если она есть.

'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