Как удалить установку, которая вызывает исключения во время удаления? - PullRequest
2 голосов
/ 23 февраля 2011

У меня есть проект установки, который использует класс System.Configuration.Install.Installer для обработки некоторых пользовательских действий. Моя логика в методе Uninstall выдает исключение (исключение нулевой ссылки, а точнее), которое приводит к завершению деинсталляции без фактического удаления чего-либо.

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

Я чувствую, что попал между камнем и наковальней. Кто-нибудь еще попал в эту ситуацию, и если да, то как вы ее обойдете?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Этот вопрос отлично ответил на мой вопрос.

По сути, я просто перекомпилировал dll-файл System.Configuration.Install.Installer без какой-либо логики в методе Uninstall.Вручную замените dll, находящуюся в месте установки программы, на вновь скомпилированный, а затем снова попытайтесь удалить программу.Деинсталлятор будет использовать новый файл DLL и не будет выдавать исключение (потому что я удалил весь свой код из этого метода).

Затем я смог исправить свой код и создать новый установщик.

На всякий случай я бросил всю свою логику удаления в блок try и ловил Exception, что, как вы можете утверждать, является плохим, но, по крайней мере, он предотвращает сбой при удалении любых изменений, внесенных мной в метод.процесс (для меня это просто означает, что некоторые файлы конфигурации могут остаться не очищенными должным образом).

0 голосов
/ 23 февраля 2011

Вы можете попробовать восстановить фиксированный MSI с помощью этой команды (где вы используете фактический путь MSI):

msiexec.exe /fv <path_to_new_msi>

Вы также можете попробовать использовать MsiZap.exe из Windows SDK:

http://msdn.microsoft.com/en-us/library/aa370523(VS.85).aspx

...