Проверка успешной деинсталляции
Я пытаюсь автоматизировать процесс установки, в котором я удаляю предыдущую версию и устанавливаю более новую версию поверх. Как проверить (в моем загрузочном блоке, закодированном на С#), если удаление удалось?
В настоящее время я запускаю удаление.
Process p = Process.Start("msiexec", /*various switches*/);
p.WaitForExit();
Я также в настоящее время запутываюсь с динамическими множественными экземплярами, которые действительно сгибают мой разум, поэтому решение этой проблемы в самом WiX затруднено, если не невозможно.
Ответы
Ответ 1
Вместо того, чтобы вызывать установщик Windows через msiexec, вы можете использовать API установщика Windows. Вы можете сделать это через P/Invoke, активируя интерфейс COM или через библиотеку оберток WiX DTF. Конкретная функция, используемая для удаления продукта, MsiConfigureProductEx
.
С помощью DTF вы можете сделать это следующим образом:
Installer.SetInternalUI(InstallUIOptions.Silent);
Installer.SetExternalUI(UiHandler, InstallLogModes.Verbose);
Installer.EnableLog(InstallLogModes.None, null);
Installer.ConfigureProduct(productCode, 0, InstallState.Removed, "");
Console.WriteLine("RebootRequired: {0} RebootInitiated: {1}", Installer.RebootRequired, Installer.RebootInitiated);
Делегат UiHandler
позволяет приложению отслеживать прогресс. Если есть ошибка, DTF генерирует исключение.
Ответ 2
В качестве альтернативы для обработки этого в вашем загрузочном блоке и при условии, что установщик для более новой версии представляет собой пакет установщика Windows (.msi), находящийся в разработке, вы можете использовать функции установщика Windows для удаления старой версии, где это необходимо. При этом обновление может быть одним из следующих:
Основное обновление - это, в основном, удаление старой версии и установка более новой версии. WiX позволяет вам легко авторизовать любой из них в проекте настройки .
Итак, вашему загрузчику просто нужно будет установить более новую версию, и пусть установщик Windows сделает все остальное.
BTW. Возможно, вам стоит взглянуть на использование загрузочного буфера WiX вместо написания вашей собственной логики. Если вы хотите, вы можете написать пользовательский интерфейс в .NET для WiX Bootstrapper, если это причина, по которой вы пишете собственный загрузчик.