2009-09-28 2 views
3

Я разработал службу Windows вместе с проектом установки с использованием Visual Studio 2008. Когда я выполняю установку обновления, я получаю следующее предупреждение:Как остановить службу Windows для установки обновления?

Следующие приложения используют файлы, которые должен обновить установщик. Вы можете закрыть приложения и нажать «Попробовать снова» или нажать «Продолжить», чтобы программа установки продолжала установку и заменяет эти файлы при перезагрузке системы.

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

Есть ли способ выполнить это как часть установщика MSI. Я бы предпочел не делать это как отдельную задачу перед исполнением установщика MSI.

Update:
на основе дальнейших исследований я обнаружил, что база данных MSI не поддерживает это, однако встроенный инсталлятор Visual Studio (настройки) проекты не обеспечивают средства, чтобы сделать это. Нужно либо настроить базу данных MSI, либо использовать WiX или коммерческий установщик.

+0

Вы можете выполнить команду оболочки из программы установки? Если это так, вы можете запустить net stop _service name_ как одну из своих первых задач, чтобы убить его. –

+0

Уг, не делай этого. Установщик Windows изначально поддерживает функции остановки/запуска. Просто используйте таблицу ServiceControl. –

ответ

2

Его уже встроены в MSI/установщика Windows ... Единственная проблема заключается в том, что классы .NET инсталлятор не использует «Сервис по установке» функции MSI. Фактически происходит то, что MSI пытается установить файлы и запустить пользовательскую команду, используя только что скопированные файлы (то есть все Visual Studio помещает MSI).

Чтобы решить эту проблему вы можете редактировать MSI с ORCA и добавьте следующую строку в ServiceControl таблицы:

1 ServiceName 170  1 C__489628C5CC1144CB47F43E8BE7F3F31D 

Компонента ID вы можете поиск из таблицы FILES ... Я просто выбрал Идентификатор компонента основного EXE-файла. 170 - это растровое изображение, которое сообщает установщику Windows о прекращении и удалении службы при установке и деинсталляции.

Это позволит очистить дорогу установщикам .NET, чтобы добавить службу, и вы можете использовать ServiceController для запуска службы после того, как она была установлена ​​с помощью пользовательской команды.

3

Если вы хотите идти по пути редактирования таблицы MSI ServiceControl, этот следующий VBS скрипт работал для меня:

Dim installer, database, view, result 
Set installer = CreateObject("WindowsInstaller.Installer") 
Set database = installer.OpenDatabase ("Installer.msi", 1) 
Set view = database.OpenView("INSERT INTO ServiceControl (ServiceControl,Name,Event,Arguments,Wait,Component_) VALUES ('ServiceName','ServiceName',170,null,null,'C__751A71A3822A287367770DB29839A759')") 
view.Execute 
database.Commit 
Set database = nothing