Установка обновления: как сохранить app.config?
У меня огромная проблема:
У меня есть старое приложение App1.0.exe. С этим приложением есть файл с именем App1.0.exe.config (конфигурация приложения). Теперь я сделал версию 2.0, с новой версией теперь есть разные настройки приложений в App config. Мой вопрос: как я могу сохранить старый App config при установке обновления?
Эта попытка решить проблему не удалась:
-Считайте старую конфигурацию с событием BeforeInstall, сохраните в контекстные параметры и запишите новую конфигурацию в событии Afterinstall. - BeforeInstall считывает новый конфиг (старый удаляется). -Не копируйте новый App config, но копируйте файл с другим именем, например, AppConfigUpdate.config, который включает новый appconfig. В событии после установки я сохраняю старую конфигурацию с помощью File.Move(). Теперь есть:
-Appconfig.exe.config_Original
-App configUpdate.config
Затем я зачитываю.config_Original и записываю параметр в AppConfigUpdate.config и переименовываю его в Appconfig.exe.config.
Моя проблема в том, что в msi есть стандартное действие, которое выполняется после выполнения моих пользовательских действий, называемое: RemoveExistingProducts. Так что теперь, когда я отлаживаю установщик, который, как я вижу, в конце моей привычки, есть старая конфигурация.config_original и новая конфигурация.config с правильными параметрами из старой конфигурации. Но после моего пользовательского действия установка удаляет.config, и остается только.config_original.
Я думаю, что RemoveExistingProducts удаляет все файлы, которые не были доставлены с пакетом обновления. Но я не могу доставить.config, потому что он перезаписывает исходную конфигурацию и все параметры теряются.
Сейчас я работаю над этой проблемой более трех дней, и мне действительно нужна ваша помощь. У меня заканчиваются идеи, как решить эту проблему, может, у кого-нибудь из вас была какая-то похожая проблема?
Извините за мой плохой английский. с уважением
2 ответа
Правильный подход заключается в использовании двух пользовательских действий для резервного копирования и восстановления вашего старого файла конфигурации. Пользовательское действие резервного копирования будет выполнено до действия RemoveExistingProducts. Пользовательское действие восстановления будет выполнено после InstallFiles. Некоторое простое пользовательское действие скрипта сделало бы эту работу.
Для более подробной информации о пользовательских действиях, пожалуйста, смотрите:
http://msdn.microsoft.com/en-us/library/aa368066(VS.85).aspx
К сожалению, установка Visual Studio не имеет хорошей поддержки планирования пользовательских действий. Вам придется использовать другой бесплатный или коммерческий инструмент MSI-авторинга.
Возможно, можно обойти поведение установщика?
Вместо того, чтобы перезаписывать конфигурацию во время установки, может сработать тестирование вашего приложения при запуске, имеет ли конфигурация формат "Версия 1". Если это так, он выполняет обновление в этот момент.
Здесь есть (старые, но действительные) сведения об обновлении app.config: http://geekswithblogs.net/akraus1/articles/64871.aspx.