2010-03-17 139 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();