Изменение конфигурации приложения без перезапуска приложения - PullRequest
7 голосов
/ 22 апреля 2011

У меня следующая проблема: я внедряю новую функцию в приложение (запускается как служба Windows), и мне бы хотелось, чтобы эта новая функция контролировалась (включалась / выключалась) с помощью какой-либо записи в файле конфигурации ( myKey *)1002 *).Я могу сохранить запись конфигурации в app.config, но если я захочу изменить ее с on-> off или иным образом, потребуется перезапустить службу Windows, и я хочу этого избежать.Я хочу, чтобы мое приложение запускалось и регистрировало изменения в конфигурации.

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

ConfigurationManager.AppSettings["myKey"]

Спасибо, Павел

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

static void Main(string[] args)
{
    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    // AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings");
    for (int i = 0; i < 10; i++)
    {
        ConfigurationManager.RefreshSection("appSettings");
        AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings");
        string myConfigData = appSettingSection.Settings["myConfigData"].Value; // still the same value, doesn't get updated
        Console.WriteLine();
        Console.WriteLine("Using GetSection(string).");
        Console.WriteLine("AppSettings section:");
        Console.WriteLine(
          appSettingSection.SectionInformation.GetRawXml()); // also XML is still the same
        Console.ReadLine();
    }
}

Я вручную редактирую файл конфигурации, когда приложение останавливается на Console.ReadLine () .

Ответы [ 2 ]

6 голосов
/ 22 апреля 2011

После загрузки исходного файла app.config его значения кэшируются, поэтому, как вы знаете, вам придется перезапустить приложение. Чтобы обойти это, нужно создать новый объект конфигурации и вручную прочитать ключи следующим образом:

var appConfig = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
string myConfigData = appConfig.AppSettings.Settings["myConfigData"].Value;
1 голос
/ 22 апреля 2011

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

FileSystemWatcher - это ... вероятно, избыточно, и не 'Т гарантируется во всех сценариях.Лично я бы просто опрашивал файл каждые (скажем) 30 секунд.

...