2013-06-17 2 views
1

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

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

Process p = Process.Start("msiexec", /*various switches*/); 
p.WaitForExit(); 

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

+0

@Soner Gönül: Есть несколько способов решить эту проблему, я могу установить раздел реестра «Удалять успех», а затем установить его как true в качестве настраиваемого действия при удалении - однако это невероятно грязно. Если у вас есть хорошие практики или хорошие идеи, я бы хотел услышать это, прежде чем совершить. – Izzy

+0

Вы должны зеркалировать ваш предыдущий установщик версий, проверяя наличие файлов, каталогов, ключей реестра и т. Д. ... – Romoku

+0

@Romoku Нет никакой гарантии, что какой-либо файл или папка, которые я проверю, все равно будут существовать в любом случае позже в жизни продукта , – Izzy

ответ

2

Вместо того, чтобы вызывать установщик Windows через msiexec, вы можете использовать API-интерфейс установщика Windows. Вы можете сделать это через P/Invoke, активируя интерфейс COM или через библиотеку обертки DTF WiX. Конкретная функция, используемая для удаления продукта, - 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 для удаления старой версии, где это необходимо. Когда вы это сделаете, обновление может быть одним из следующих:

  • Major Upgrade - свойство UpgradeCode - это то же самое; ProductCode отличается
  • Minor Upgrade - Характеристики UpgradeCode и ProductCode одинаковы; ProductVersion выше
  • Related product removal - Удаление любым UpgradeCodes вы задаете

Основное улучшение в основном удаление старой версии и установки новой версии. WiX позволяет вам авторизовать любой из них в проекте настройки quite easily.

Итак, вашему загрузчику просто нужно будет установить более новую версию и позволить установщику Windows сделать все остальное.


BTW-Возможно, вам стоит взглянуть на использование загрузочного устройства WiX вместо написания собственной логики. Если вы хотите, вы можете написать пользовательский интерфейс в .NET для WiX Bootstrapper, если это причина, по которой вы пишете свой собственный загрузочный файл.

+0

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