重新加载.NET配置文件

8

在修改配置文件后,我需要重新加载它。如何使用应用程序域完成这个操作?提供一个代码示例会很有帮助。


我们真的需要在对配置文件进行更改后重新加载它吗?我不知道,我只是在问,因为我记得在某个地方读到过我们不需要重新加载。谢谢! - Mahesh Velaga
这是什么类型的程序?Windows服务?ASP.NET? - John Saunders
可能是重复的问题:运行时从外部配置文件重新加载配置设置 - farid bekran
5个回答

11

假设您有以下配置文件:

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

我们先尝试一种朴素的方法。 下面的应用程序将每秒尝试一次获取名为testappSetting的值,并打印其值:

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
很遗憾这篇帖子没有被标记为答案。我倾向于更详细的回答,但这只是我的偏好。 - Eric Wu

9

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

1

是的,这是可能的……取决于您如何访问配置文件。

如果您依赖默认行为,则答案是“否”。

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

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

有一个警告,只有通过代码直接访问的属性才能重新加载,当您执行此操作时,自动配置将不会重新加载。


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应该被卸载然后重新创建。

这可能是一种解决方案,可以在多个应用程序之间重复使用配置文件,而无需为每个应用程序复制它。 - Markus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接