2010-07-21 6 views
3

Я хотел бы добавить кнопку «Удалить» в мою программу, которая запустит удаление, чтобы удалить программу, а затем немедленно выйти. Каков наилучший способ: a) определить, присутствует ли данный деинсталлятор, и b) найти правильный деинсталлятор и запустить его?Запуск деинсталлятора из кода

Могу ли я использовать реестр в надежном режиме? Я помню, как ранее использовал реестр для исправления некоторых сломанных установок и думал, что могу перебирать записи и идентифицировать их, но я беспокоюсь, что использование реестра может быть ненадежным и/или работать на всех системах?

Еще одна мысль состоит в том, что я мог бы фактически хранить информацию об удалении в реестре во время самой установки, а затем использовать эту информацию, чтобы как-то найти нужный деинсталлятор. Похоже, что это был бы самый надежный метод, но есть ли такой идентификатор, который я мог бы сохранить, чтобы затем передать обратно в Windows Installer?

+0

Установлена ​​ли ваша программа через MSI, созданный с помощью проекта установки Visual Studio? –

+1

Вы не знаете, имеет ли ваша * собственная программа * деинсталлятор? Необычный. –

+0

@ Ханы: Позвольте мне уточнить: программа устанавливается как опция, но также доступна как переносимый .exe в zip-файле. Поэтому нет никакой гарантии, что он обязательно будет установлен *. Что касается MSI, я использую WiX для его создания. – devios1

ответ

3

Поскольку вы сделали это с помощью установщика Windows, я предполагаю, что вы распространяете свое приложение с помощью MSI. Тем не менее, вы можете вызвать msiexec/x {ProductCode} из своего приложения для первоначальной деинсталляции. Вы можете получить код продукта, указав установщик на ключ/значение реестра, которое может читать ваше приложение, или вы можете его жестко закодировать или обновить код в своем приложении. Если вы скопируете код UpgradeCode, вам придется обратиться в API установщика Windows, чтобы узнать установленный ProductCode для этого UpgradeCode.

+0

Прохладный, это звучит как раз то, что мне нужно. – devios1

+0

Вы захотите использовать сборку Microsoft.Deployment.WindowsInstaller, найденную в каталоге SDK WiX. Взгляните на файл справки, предоставленный для члена ProductInstallation :: GetRelatedProducts (строка UpgradeCode). Это вернет IEnumeratble , у которого есть getter для ProductCode. Если вы не хотите включать эту сборку в свое приложение, вам придется написать свой собственный P/Invokes для MSI. MsiEnumRelatedProducts - это то, что вам нужно от msi.dll. Взгляните на: codeproject.com/KB/cs/msiinterop.aspx Лично я люблю DTF. –

+0

Моя мысль заключалась в том, чтобы просто хранить {ProductCode} в разделе реестра во время установки, а затем проверить, существует ли этот ключ внутри программы, вызывая msiexec/x {ProductCode}, если это так. Действительно ли мне нужно программно обращаться к MSI? И что такое DTF? – devios1

Смежные вопросы