Перезагрузка файла конфигурации .NET - PullRequest
8 голосов
/ 17 марта 2010

Мне нужно перезагрузить файл конфигурации после его изменения. Как это можно сделать с помощью доменов приложений? Пример кода будет полезен.

Ответы [ 5 ]

10 голосов
/ 26 октября 2013

Допустим, у вас есть следующий файл конфигурации:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="test" value="1" />
  </appSettings>
</configuration>

Давайте сначала попробуем наивный подход. Следующее приложение попытается получить значение appSetting с именем test один раз в секунду и вывести его значение:

static void Main(string[] args)
{
    while(true)
    {
        Console.WriteLine(ConfigurationManager.AppSettings["test"]);
        Thread.Sleep(1000);
    }
}

Но увы! Пока он работает, вы заметите, что он продолжает печатать 1 и не регистрирует никаких изменений.

Если вы обновите свой код до следующего, это исправит эту проблему и будет получать изменения при каждом его изменении:

static void Main(string[] args)
{
    while(true)
    {
        ConfigurationManager.RefreshSection("appSettings");
        Console.WriteLine(ConfigurationManager.AppSettings["test"]);
        Thread.Sleep(1000);
    }
}
9 голосов
/ 17 марта 2010

ConfigurationManager.RefreshSection может работать на вас.

2 голосов
/ 25 февраля 2016
  ConfigurationManager.RefreshSection("configuration");
  Properties.Settings.Default.Reload();
1 голос
/ 17 марта 2010

Да, это возможно ... в зависимости от КАК вы получаете доступ к файлу конфигурации.

Если вы полагаетесь на поведение по умолчанию, то ответ будет NO .

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

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

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

0 голосов
/ 17 марта 2010

Я действительно нашел решение данной проблемы. Ниже приведены несколько строк кода того, как это можно сделать:

            AppDomainSetup domaininfo = new AppDomainSetup();

            domaininfo.ApplicationBase = System.Environment.CurrentDirectory;
            domaininfo.ConfigurationFile = "Target_Config.exe.config";

            Evidence adevidence = AppDomain.CurrentDomain.Evidence;

            AppDomain dom = AppDomain.CreateDomain("test", adevidence, domaininfo);

            var someType =(SomeType)dom.CreateInstanceAndUnwrap("Target_Assembly", 
                "Target_Assembly.SomeType");

Ключевым моментом здесь является класс AppDomainSetup, который позволяет установить свойство файла конфигурации для создаваемой сборки. Теперь мы можем отслеживать изменения в файле конфигурации "Target_Config.exe.config". При его изменении созданный выше домен приложения должен быть выгружен, а затем воссоздан.

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