2010-03-17 192 views
8

我需要在修改它之后重新加载配置文件。这可以如何使用appdomains完成?代码示例会很有用。重新加载.NET配置文件

+0

我们真的需要做后重新加载配置文件一些变化!?,我不知道,我只是问,因为我记得读过一些我们不需要重新加载的地方。谢谢! – 2010-03-17 19:43:57

+0

这是什么类型的程序? Windows服务? ASP.NET? – 2010-03-17 20:01:42

+0

[在运行时从外部配置文件重新加载配置设置]可能的重复(http://stackoverflow.com/questions/4934898/reload-configuration-settings-from-an-external-config-file-during-run -time) – 2015-06-24 09:26:05

回答

1

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

如果您依赖默认行为,那么答案是NO

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

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

有一个告诫,它只适用于通过代码直接访问的属性,当你做这样的事情时,自动配置不会被重新加载。

0

我已经找到了给定问题的解决方案。下面是代码fiew行如何可以做到这一点:

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

+0

这可能是跨多个应用程序重用配置文件而不为每个应用程序复制的解决方案。 – Markus 2010-03-17 20:28:33

7

比方说,你有以下的配置文件:

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

让我们先来试试幼稚的做法。下面的应用程序将尝试抢命名test每秒一次的appSetting的价值,并打印其值:

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); 
    } 
} 
+0

可惜这篇文章没有标记为答案。我倾向于更喜欢_verbose_答案,但是,它就是我。 – 2016-08-23 14:45:45

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