Как удалить "указанная служба уже существует" при установке новых версий моего программного обеспечения?
У меня есть приложение VS2008, которое включает в себя проект службы (я буду называть его ServiceProject). У меня есть проект установки (InstallationProject), установленный на RemovePreviousVersions. Кроме того, у меня есть пользовательские действия, установленные для InstallationProject, для установки, фиксации, отката и удаления первичного вывода из ServiceProject.
Иногда, когда я создаю новые версии установщика, я могу установить без ошибок. Зачастую, когда я добираюсь до настройки службы (ввод имени пользователя и пароля в установщик), он не работает с ошибкой, "Указанная служба уже существует" .
Я не знаю, почему это противоречиво, хотя я считал, что, возможно, есть какая-то подпись для службы, и если служба не модифицирована, она может удалить ее успешно, но с изменениями, t признать услугу. Однако я редко вношу изменения в службу, поэтому я сомневаюсь в этом.
Как я могу сделать мой установщик успешным обновлением службы без этой ошибки? Моя работа - это вручную перейти в панель управления, удалить прежнее приложение, а затем запустить установщик.
Ответы
Ответ 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]()