重新加载.NET配置文件

时间:2010-03-17 19:35:44

标签: c# .net configuration configuration-files

我需要在修改后重新加载配置文件。如何使用appdomains完成此操作?代码示例很有用。

5 个答案:

答案 0 :(得分:10)

假设您有以下配置文件:

<?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);
    }
}

答案 1 :(得分:9)

答案 2 :(得分:2)

  ConfigurationManager.RefreshSection("configuration");
  Properties.Settings.Default.Reload();

答案 3 :(得分:1)

是的,有可能......取决于 HOW 您访问配置文件。

如果您依赖默认行为,则答案为

但是,如果您通过项目常用方法的static属性访问配置,则可以重新加载它。

我现在没有代码片段,但即使使用FileSystemWatcher来检测config文件中的更改,我也做了类似的事情。

有一点需要注意,它仅适用于您通过代码直接访问的属性,当您执行此类操作时,不会重新加载自动配置。

答案 4 :(得分:0)

我实际上找到了给定问题的解决方案。下面是关于如何做到这一点的代码行:

            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类,它允许在要创建的程序集上设置configurationfile属性。现在,我们可以监视配置文件“Target_Config.exe.config”以进行更改。更改后,应卸载上面创建的appdomain,然后重新创建。