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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

v1.0.0 пользовательское действие Uninstall()

v1.0.1 пользовательское действие Install()

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

v1.0.1 пользовательское действие Install()

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

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

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

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

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

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

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

Ответ 2

Поместите "Не (установленное ИЛИ ПРЕДВАРИТЕЛЬНОЕ ОБОЗНАЧЕНИЕ)" в Свойстве Custom Actions- > Install Condition.

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

А также добавьте "NOTPREVIOUSVERSIONSINSTALLED" Как SJown в Trail Image