Как мне удалить Указанная служба уже существует, когда я устанавливаю новые версии своего программного обеспечения?

У меня есть приложение VS2008, которое включает сервисный проект (я назову его ServiceProject). У меня установочный проект (InstallationProject) установлен на RemovePreviousVersions. Кроме того, у меня установлены настраиваемые действия для InstallationProject, для установки, фиксации, отката и удаления основного вывода из ServiceProject.

Иногда, когда я создаю новые версии установщика, я могу установить без ошибок. Часто, когда я дохожу до настройки службы (ввода имени пользователя и пароля в программу установки), происходит сбой с ошибкой «Указанная служба уже существует».

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

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


person pc1oad1etter    schedule 16.01.2009    source источник
comment
это дублирование stackoverflow.com/questions/370940/?   -  person Ruben Bartelink    schedule 06.03.2009


Ответы (5)


Помимо проверки того, что версии файлов отличаются, как сказал StingyJack, у вас есть еще одна проблема. Из документации VS (извините, не в сети)

Если вы установили и установили, и удалили настраиваемые действия в проекте установки приложения, и вы включили свойство RemovePreviousVersions в Visual Studio 2005, предыдущая версия продукта будет удалена во время обновления. Однако это поведение изменилось в Visual Studio 2008 следующим образом:

В Visual Studio 2005 при обновлении с версии 1.0.0 до версии 1.0.1 пользовательские действия вызывались следующим образом:

v1.0.0 настраиваемое действие Удалить ()

v1.0.1 настраиваемое действие Install ()

В Visual Studio 2008 действие удаления не вызывается, как показано ниже:

v1.0.1 настраиваемое действие Install ()

Если вы создали настраиваемые действия, основанные на старом поведении, вам необходимо изменить код для нового поведения. Это изменение поведения влияет только на обновления, но не на удаление.

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

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

Два варианта: -

Добавьте код в настраиваемое действие «Установить / зафиксировать», чтобы остановить службу, дождитесь, пока установщик заменит файлы служб, а затем перезапустите службу. См. ответ PonalSuper3 в этом ветка

Вернуть поведение VS2008 как это работало в VS2005 (пользовательское действие Uninstall старых версий вызывается перед установкой новой версии) с помощью Orca, чтобы изменить InstallExecuteSequence.RemoveExistingProducts сразу после .InstallInitialize - обычно вы устанавливаете .RemoveExistingProducts на 1525, но проверьте свой индивидуальный MSI.

Я добавил сценарий , который вы можете добавить в свою сборку. процесс изменения InstallExecuteSequence в MSI

person Ryan    schedule 06.03.2009
comment
Это первое, что я видел убедительное объяснение того, почему удаление удаляет службу Windows, а обновление - нет. - person Adam Caviness; 23.12.2011

Поместите «Не (установлено ИЛИ ПРЕДЫДУЩАЯ ВЕРСИЯ УСТАНОВЛЕНА)» в свойстве Настраиваемые действия-> Условие установки.

person Tomer Pintel    schedule 13.01.2010
comment
У меня работает с Visual Studio 2017, но «Райан для VS2005 / 2008. - person antonio; 20.04.2018

Убедитесь, что версия сборки службы и GUID (в AssemblyInfo.vb / cs) меняются при развертывании каждого нового пакета установщика. Если он обнаруживает ту же версию, обновление не выполняется.

person StingyJack    schedule 16.01.2009
comment
этот конкретный guid встроен в код (не в графический интерфейс с автоматическим обновлением версии) - имеет ли значение, как я обновляю? - person pc1oad1etter; 22.01.2009
comment
Я попытался обновить две версии (AssemblyVersion, FileVersion, что-то в этом роде), и это позволило мне установить, но запросил перезагрузку. Можно ли этого ожидать - что каждый раз, когда служба обновляется, пользователю будет предложено перезагрузиться для завершения? - person pc1oad1etter; 22.01.2009
comment
Насчет перезагрузок не знаю. Возможно, это говорит об этом, потому что пользователям это проще сделать, чем инструктировать их о перезапуске служб Windows. - person StingyJack; 22.01.2009
comment
необходимость перезагрузки предполагает, что файлы были заблокированы, т. е. служба не была остановлена ​​должным образом. Что-то не так. - person Ruben Bartelink; 06.03.2009
comment
Также @StingyJack: вы говорите, что обновления не работают, более того, обновления работают так, как задумано - они не считают файл более новым и, следовательно, не пытаются обновить версию, поскольку она такая же. Но мне нужно пройти долгий путь, чтобы получить права редактирования! - person Ruben Bartelink; 06.03.2009
comment
Не -1, поскольку это соображение, но другой ответ лучше - person Ruben Bartelink; 06.03.2009

Что-то, что может помочь, но не было сказано ни в одном из вышеперечисленных, связанных с ответом Райана. Та же проблема случилась со мной, пока я не сделал это: откройте .msi в Orca и найдите таблицу обновлений. Там, где находится строка с предыдущей установленной версией (первая запись у меня), вы должны увидеть код обновления. Найдите .msi-файл установленной в данный момент программы (ту, которую вы хотите обновить), найдите код обновления (который вы можете сделать в orca), скопируйте и вставьте его в эту таблицу обновлений для вашего нового .msi-файла. Это помогло мне.

person GetBrutal    schedule 02.04.2012

Попробуйте этот код в своем классе установщика. Надеюсь, это решит вашу проблему.

protected override void OnBeforeInstall(IDictionary savedState)
        {
            if (LaunchOnBeforeInstall())
            {
                base.OnBeforeInstall(savedState);
            }
            else
            {
                throw new Exception("You cancelled installation");
            }
        }
        public bool LaunchOnBeforeInstall()
        {
            Form2 frm2 = new Form2();
            DialogResult result = frm2.ShowDialog();
            if (result == DialogResult.Cancel)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

А также поставьте

person Tanmay Nehete    schedule 24.11.2015