a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C# > 正文

基于動(dòng)態(tài)修改App.Config與web.Config的使用詳解

2020-01-24 03:20:43
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

首先假設(shè)你的應(yīng)用程序配置文件如下:

復(fù)制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <appSettings>

    <add key="name" value="old"/>

  </appSettings>

</configuration>


Ok,那么如何在運(yùn)行時(shí)去修改name的值呢??

有很多童鞋會(huì)說(shuō)可以使用Xml讀取配置文件,然后xxx。。。。

當(dāng)然這種方法肯定可以解決問題,有沒有其他方法呢??

在這里我要介紹一種比較簡(jiǎn)單的方法,可能已經(jīng)有人知道了,那就是使用ConfigurationManager

ConfigurationManager 存在System.Configuration.dll 中。

代碼如下:

復(fù)制代碼 代碼如下:

public static void Main()
{
    Console.WriteLine(ConfigurationManager.AppSettings["name"]);
    ChangeConfiguration();
    Console.WriteLine(ConfigurationManager.AppSettings["name"]);
    Console.ReadLine();
}

private static void ChangeConfiguration()
{
    //讀取程序集的配置文件
    string assemblyConfigFile = Assembly.GetEntryAssembly().Location;

    Configuration config = ConfigurationManager.OpenExeConfiguration(assemblyConfigFile);
    //獲取appSettings節(jié)點(diǎn)
    AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
   

    //刪除name,然后添加新值
    appSettings.Settings.Remove("name");
    appSettings.Settings.Add("name", "new");

    //保存配置文件
    config.Save();
}


代碼很簡(jiǎn)單:首先讀取配置文件,接著獲取appSettings節(jié)點(diǎn),然后修改,接著保存。

運(yùn)行:結(jié)果如下:

clip_image002

可以看到輸出的值是兩個(gè)old.

為什么??

查找msdn文檔可以發(fā)現(xiàn)微軟出于性能考慮,對(duì)ConfigurationManager采用了緩存策略,所以如果要讀取新的值,應(yīng)該使用ConfigurationManagerRefreshSection來(lái)進(jìn)行刷新,

ConfigurationManager . RefreshSection:

刷新命名節(jié),這樣在下次檢索它時(shí)將從磁盤重新讀取它。

于是將Main方法修改為:

Console.WriteLine(ConfigurationManager.AppSettings["name"]);

ChangeConfiguration();

ConfigurationManager.RefreshSection("appSettings");

Console.WriteLine(ConfigurationManager.AppSettings["name"]);

重新清理解決方案,重新運(yùn)行:

clip_image004

可以看到,仍然是兩個(gè)old。。。

為什么??  

難道值沒有修改??,我們打開應(yīng)用程序的配置文件,可以通過監(jiān)視assemblyConfigFile獲得路徑

上面是xxx/bin/Debug/CAStudy.exe.,對(duì)應(yīng)的配置文件就是CAStudy.exe.config

clip_image006

文件的內(nèi)容如下:

clip_image008

 

可以發(fā)現(xiàn)value 值已經(jīng)更改,那么為什么輸出還是old,old 呢??

 

為了驗(yàn)證不是VS2010的問題。

首先手動(dòng)將CAStudy.exe.config 文件中的value改為”old”,接著再次運(yùn)行CAStudy.exe 結(jié)果如下:

clip_image010 

可以看到輸出時(shí)old,和new。為什么會(huì)這樣???

難道調(diào)試時(shí)讀取的不是修改的配置文件,或者修改的配置文件并不是調(diào)試的應(yīng)用程序讀取的文件??

assemblyConfigFile 中設(shè)置斷點(diǎn),可以發(fā)現(xiàn)assemblyConfigFile 讀取的是CAStudy.exe.Config。但是vs調(diào)試的時(shí)候運(yùn)行的是CAStudy.vshost.exe。也就是說(shuō)我們使用ConfigurationManager.OpenExeConfiguration 打開的是CAStudy.exe.config文件,但是我們調(diào)試的應(yīng)用程序CAStudy.vshost.exe使用的是CAStudy.vshost.exe.config文件。

那么還有其他的方式可以準(zhǔn)確的獲取應(yīng)用程序配置文件嗎??

有的,使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

ChangeConfiguration()方法修改如下:

復(fù)制代碼 代碼如下:

private static void ChangeConfiguration()
{

    //讀取程序集的配置文件
    string assemblyConfigFile = Assembly.GetEntryAssembly().Location;
    string appDomainConfigFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
   

     //獲取appSettings節(jié)點(diǎn)
    AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
   

    //刪除name,然后添加新值
    appSettings.Settings.Remove("name");
    appSettings.Settings.Add("name", "new");

    //保存配置文件
    config.Save();
}


清理,重新運(yùn)行:

使用默認(rèn)的不傳遞字符串的版本就可以打開當(dāng)前配置文件了。

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

如果要查看當(dāng)前配置文件的完整路徑可以使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

重新運(yùn)行,結(jié)果如下:

clip_image012 

另外值得一提的是:ConfigurationManager.RefreshSection 不支持section Group.所以對(duì)于WCF的服務(wù),你必須一個(gè)一個(gè)的RefreshSection:

ConfigurationManager.RefreshSection("system.serviceModel/behaviors");

ConfigurationManager.RefreshSection("system.serviceModel/bindings");

ConfigurationManager.RefreshSection("system.serviceModel/client");

ConfigurationManager.RefreshSection("system.serviceModel/services");

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费成人高清 | 午夜精品久久久久久久蜜桃app | 中文字幕在线一区 | 狠狠操天天干 | 国产成人精品免高潮在线观看 | 99re在线视频 | 国产中文在线 | 日韩成人一区二区 | 日本不卡一区二区三区在线观看 | 美女一级毛片 | 色噜噜亚洲 | 成人久久久久爱 | 一级毛片视频 | 国产精品色网站 | 精品国产色 | 国产一区欧美 | 一级免费视频 | 性色av网| 91免费看 | 欧美电影一区二区三区 | 日日草视频 | 国产乱肥老妇国产一区二 | 久草在线中文最新视频 | 91精品一区二区三区久久久久久 | 久久精品99国产精品亚洲最刺激 | 精品国产不卡一区二区三区 | 久久久久久av | 国产精品一区二区三区四区 | 中文字幕亚洲区 | 国产成人午夜精品影院游乐网 | 欧美午夜精品一区二区三区 | 成人在线高清视频 | 欧美视频一区 | 欧美一区二区在线观看 | 国产九色视频 | 国产一区二区不卡在线 | 有码在线播放 | 一区二区亚洲 | 日韩欧美国产精品综合嫩v 午夜精品久久久久久久久 97色在线视频 | 久久久国产精品入口麻豆 | 91视频免费观看入口 |