Я обновил [MSI-проект [.vdproj, встроенный в VS2008] System.Configuration.Install.Installer, установив ServiceProcessInstaller
и ServiceInstaller
с Visual Studio 2005 до 2008. Никаких настроек для класс установщика (т. е. не пытается запустить или остановить службы или зарегистрировать дочерние элементы)
RemovePreviousVersions
установлен на true
, и я изменяю Version
и ProductCode
. Это вызывает ошибку во время установки:
"ошибка 1001: указанная служба уже существует"
Googling дает материал (но не до сих пор на SO): - Google для "Указанный сервис уже существует"
Самый полезный, который я когда-либо видел, это http://forums.msdn.microsoft.com/en-US/winformssetup/thread/b2d1bd22-8499-454e-9cec-1e42c03e2557/
однако это не отвечает на фундаментальный вопрос: -
Учитывая, что пользователь может выбрать либо:
а) место установки, такое же
или б) место установки, отличающееся
Каковы минимальные изменения кода, которые разумно сделать, чтобы старая служба была удалена, а новая установлена? Или существует что-то кроме изменения кода, необходимого для решения этой проблемы в базовом сценарии обновления v1.0.1 до v1.0.2 той же службы с тем же именем (то есть подписывание)
(AIUI строгое именование вступает в игру только в том случае, если в старом инсталляторе есть значительный шаг удаления, которого нет в новом.)
Я создал новый установщик в VS 2008, и он не лучше.
Пока что мой обходной путь - перестать обновлять Version
и ProductCode
, заставляя пользователя вручную удалять, когда ему говорят, что у него уже установлена версия.
Дополнение благодаря divo's probing: Хотя самый простой взлом, который мог бы сработать, это сказать: «Если вызывается шаг установки и его обновление, сначала вызовите шаг удаления для службы», как правильный официально благословенный ответ! (например, как простой хак справляется, когда служба переименовывается во время обновления?)