Как мой WiX-деинсталлятор может восстановить значение реестра? - PullRequest
3 голосов
/ 25 марта 2010

Установщик, который я пишу с использованием WiX 3.0, использует элемент RegistryValue для изменения существующего значения реестра (изначально написанного нашим основным продуктом). Я пытаюсь найти способ восстановить значение реестра, когда пользователь удаляет мою утилиту. Я хотел бы избежать использования пользовательских действий, но это может быть единственным выходом? ТИА.

Ответы [ 3 ]

3 голосов
/ 25 марта 2010

Я сделал это. В качестве значения реестра использовалось приложение, связанное с расширением файла, но это может быть любое значение реестра.

Моей первой идеей было использовать «настраиваемые действия» для установки и удаления для сохранения и восстановить, соответственно, связанное состояние regy. это казалось достаточно простым.

Я создал проект установки в VS2008 и создал CA как файлы javascript. Сценарий «при установке» захватил существующее значение regy и спрятал его в известном месте. Сценарий «при удалении» будет искать в известном месте, а затем помещать найденное значение обратно в исходное местоположение. Легко, правда?

Было две проблемы:

  1. скрипт, который запускался во время установки, чтобы сохранить существующее значение реестра, работает ПОСЛЕ реестра уже обновлен со значениями для вновь установленной вещи. Таким образом, он сохранил новую настройку вместо настройки, существовавшей до запуска MSI. Не полезно.

  2. Сценарий, который запускается во время удаления, запускается ПОСЛЕ значений реестра и фактически всего поддерева каталога,
    были удалены Включая скрытое значение. Так что он потерял свое состояние.


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

На самом деле есть еще один поворот. Очевидно, сценарий «Восстановить» (на удалить) не будет работать, если он будет запущен после удаления записей реестра для приложения. Теперь я не могу вспомнить, почему ... но я также определил, что этот сценарий не может запускаться до этого . Почему-то это тоже не сработало.

Итак, я изменил MSI для запуска сценария восстановления дважды . На этапе 1 он передает спрятанное значение в «парковку» в реестре. Затем ключи и значения приложения в реестре удаляются, но парковка остается. В Фаза 2, за пределами защиты транзакций, сценарий восстановления получает состояние с парковки, восстанавливает файл ассоциации, а затем удаляет парковку.

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

Как это работает в разработке:

  • установить on install и on uninstall CA в проекте VS
  • сборка проекта установки VS
  • запустить скрипт постобработки, который изменяет MSI.

При использовании MSI это немного сложнее, чем я думал, но работает.

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


Наконец, вы сказали, что хотите избежать CA. Для меня, CA избегают, потому что их больно производить в C ++, а создавать их в .NET часто неуместно. Но довольно просто использовать Javascript для CA. Некоторые люди думают, что скрипт - это неправильный инструмент для работы CA . Я думаю, что это неправильно. Я думаю, что скрипт - очень хороший инструмент для этой цели . И как только вы сможете принять скрипт в качестве хорошего инструмента, вам не нужно будет думать о создании собственного CA.

0 голосов
/ 16 апреля 2015

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

Я нашел расширение для wix, в котором есть функции для этой цели ссылка на расширения wix

0 голосов
/ 07 апреля 2010

Таблица реестра не может записать значение реестра во время удаления, поэтому правильно, что это необходимо сделать с помощью настраиваемого действия. Я считаю, что использование сценария плохо. Решите ли вы слушать - решать вам. Я могу сказать вам, что как раз на днях меня вызвали, чтобы решить проблему, когда некоторые написали vbscript CA, который не работал, потому что объект файловой системы был незарегистрирован как часть процесса блокировки безопасности.

Я предлагаю C ++ или C # / DTF в зависимости от ваших потребностей.

...