Как устранить «указанная служба уже существует» при установке новых версий моего программного обеспечения? - PullRequest
17 голосов
/ 16 января 2009

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

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

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

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

Ответы [ 5 ]

19 голосов
/ 06 марта 2009

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8 голосов
/ 13 января 2010

Поставьте «Не установлено (установлено или предварительно установлено) в свойстве Настраиваемые действия-> Установить условие.

4 голосов
/ 16 января 2009

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

2 голосов
/ 02 апреля 2012

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

0 голосов
/ 24 ноября 2015

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

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

А также поставить "НЕ ПРЕДВАРИТЕЛЬНЫЕ ВЕРСИИ УСТАНОВЛЕНЫ" As SJown in Trail Image

...