Проверка успешной деинсталляции

Я пытаюсь автоматизировать процесс установки, в котором я удаляю предыдущую версию и устанавливаю более новую версию поверх. Как проверить (в моем загрузочном блоке, закодированном на С#), если удаление удалось?

В настоящее время я запускаю удаление.

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, если это причина, по которой вы пишете собственный загрузчик.