Возможно ли переключение app.config во время выполнения? - PullRequest
8 голосов
/ 12 января 2009

Есть ли способ во время выполнения выключить приложение app.config (current.config в new.config, файл в файл). У меня есть процесс резервного копирования / восстановления, который должен заменить свой собственный файл application.exe.config. Я видел этот пост , но он не отвечает, как это сделать во время выполнения.

Ответы [ 5 ]

10 голосов
/ 13 января 2009

Оказывается, я могу поменять файл .config на новый и выполнить ConfigurationManager.RefreshSection (...) для каждого раздела. Он обновится из нового файла .config.

5 голосов
/ 13 января 2009

Microsoft .NET app.config не предназначен для вашего сценария, как и многие другие. Я часто сталкиваюсь с подобной потребностью, поэтому я потратил много усилий на разработку решения.

  1. Редизайн для использования app.config только в качестве начальной загрузки конфигурации: укажите, где найти остальные данные о реальной конфигурации. Эта информация почти никогда не должна изменяться, поэтому нет необходимости обрабатывать просмотр файлов или перезапуск приложений.

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

  3. Реализуйте простую библиотеку, чтобы обернуть ваш доступ к конфигурации, чтобы у вас был простой API для остальной части вашего приложения (через внедрение зависимостей). Скрыть использование app.config, а также ваши реальные места хранения конфигурации. Поскольку .NET строго типизирован, настройте параметры конфигурации так - преобразуйте каждую полученную строку в наиболее специфичный доступный тип (URL, Int32, FileInfo и т. Д.).

  4. Определите, какие параметры конфигурации можно безопасно изменять во время выполнения по сравнению с теми, которые не могут. Как правило, некоторые настройки необходимо менять вместе с другими, или просто не имеет смысла вообще их менять. Если все ваши данные конфигурации могут безопасно изменяться во время выполнения, тогда это облегчает задачу, но я Сильно сомневаюсь в таком сценарии. По возможности скрывайте изменчивость и взаимозависимости параметров конфигурации.

  5. Создайте ответ на недоступность ваших реальных данных конфигурации. Я предпочитаю трактовать отсутствие какого-либо параметра конфигурации как фатальную ошибку, которая прерывает работу приложения, если только я не могу определить используемый по умолчанию. Аналогично, я прекращаю работу при отсутствии контейнера хранилища настроек (файл, таблица базы данных и т. Д.).

Наслаждайтесь и наилучшими пожеланиями.

2 голосов
/ 12 января 2009

Можете ли вы перезапустить приложение, когда обнаружите, что вам нужно переключать файлы? Если это так, это просто вопрос переключения файлов и перезапуска. Теперь хитрый бит равен , если .NET сохраняет файл app.config открытым во время работы программы. Я подозреваю, что это не так, но если наиболее очевидный подход не удался, я предлагаю вам второе приложение (cfgswitcher.exe), которое ожидает завершения процесса с идентификатором PID, указанным в командной строке, затем переключает файлы конфигурации и запускает оригинальный процесс. Тогда ваше приложение просто должно запустить cfgswitcher.exe (передавая свой собственный PID в качестве аргумента командной строки) и завершить работу.

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

РЕДАКТИРОВАТЬ: если вы не можете перезапустить приложение (или даже его часть в новом домене приложений), то различные аспекты app.config (привязки сборки и т. Д.) Не могут быть изменены. Если вас интересует только изменение ваших собственных разделов конфигурации, то я предлагаю вам сохранить их в отдельном файле конфигурации и перезагрузить их, когда вы захотите.

0 голосов
/ 12 января 2009

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

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

Вы уверены, , что обмен конфигурационным файлом - это лучший способ достичь того требования, которое вам необходимо выполнить? Я имею в виду, это довольно необычная вещь. На вашем месте я бы попытался придумать какой-то другой подход.

0 голосов
/ 12 января 2009

Посмотрите на события, доступные вам в классе ApplicationSettingsBase. Есть PropertyChanged & SettingChanging, которая может дать вам то, что вам нужно.

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

...