为什么写配置文件时,要用调用ConfigurationManager.RefreshSection

whoyousee 2011-08-17 09:52:22
public static void CreateAppSettings()
{
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.None);
string sectionName = "appSettings";
int appStgCnt =
ConfigurationManager.AppSettings.Count;
string newKey = "NewKey" + appStgCnt.ToString();
string newValue = DateTime.Now.ToLongDateString() +
" " + DateTime.Now.ToLongTimeString();
config.AppSettings.Settings.Add(newKey, newValue);
config.Save(ConfigurationSaveMode.Modified);
//msdn说:刷新命名节,这样在下次检索它时将从磁盘重新读取它。
//这是个静态方法,怎么能影响config的配置啊?
//所有的配置信息是在config对象里面啊?
ConfigurationManager.RefreshSection(sectionName);
AppSettingsSection appSettingSection =
(AppSettingsSection)config.GetSection(sectionName);
Console.WriteLine();
Console.WriteLine("Using GetSection(string).");
Console.WriteLine("AppSettings section XML:");
Console.WriteLine(
appSettingSection.SectionInformation.GetRawXml());
}


ConfigurationManager.RefreshSection(sectionName);
这个是个静态方法,
...全文
525 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
whoyousee 2011-08-17
  • 打赏
  • 举报
回复
(分不是好多,能问点就多问点)!^_^
我在一个配置文件添加了几个固定的key,下次程序运行时,怎么修改这些key对应的value?
public void SetUi()
{
try
{
tbCn.Text = conf.AppSettings.Settings["tbCn"].Value;
tbCn1.Text = conf.AppSettings.Settings["tbCn1"].Value;
tbEn.Text = conf.AppSettings.Settings["tbEn"].Value;
tbEn1.Text = conf.AppSettings.Settings["tbEn1"].Value;
}
catch (Exception)
{
}
}
public void SaveUi()
{
try
{
//这里每次都要Clear一下,不然如果原先有这个key时,value就会以","添加并没有覆盖
AppSettings.Settings.Clear();
AppSettings.Settings.Add("tbCn", form.tbCn.Text);
AppSettings.Settings.Add("tbCn1", form.tbCn1.Text);
AppSettings.Settings.Add("tbEn", form.tbEn.Text);
AppSettings.Settings.Add("tbEn1", form.tbEn1.Text);
Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection(sectionName);

}
catch (Exception)
{
}
}
whoyousee 2011-08-17
  • 打赏
  • 举报
回复
各位高手还有些问题:
就是,我把上面的代码换成
  System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoaming);

保存时出错:
“不能编辑已锁定的 ConfigurationSection 属性。”
  • 打赏
  • 举报
回复
我觉得MSDN说得已经很明白了,调用它之后,再使用config.GetSection(sectionName)时,总是从配置文件中重新读取(而不是从先前读取出来的Config对象中,不管Config对象在保存之前做了什么修改)
极地_雪狼 2011-08-17
  • 打赏
  • 举报
回复
保持一致,防止缓存之类的出现。虽然干吃馒头也能咽下去,但边吃边喝水更好,这样就不会出现噎着的情况了。
qldsrx 2011-08-17
  • 打赏
  • 举报
回复
不过,如果配置文件还有其它地方用到,而别处使用的是静态方法,建议你最后刷新下,以防其他人使用出错。
qldsrx 2011-08-17
  • 打赏
  • 举报
回复
楼主,你的config是通过
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
得到的,因此无需添加
ConfigurationManager.RefreshSection(sectionName);


那个方法只对ConfigurationManager.AppSettings[""]这类静态属性有影响,直接通过OpenExeConfiguration方法打开的特殊对象不受影响。
换句话说,你那段代码是多余的。
风骑士之怒 2011-08-17
  • 打赏
  • 举报
回复

static Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
static void Main(string[] args)
{
GetAppSettings();
CreateAppSettings();
GetAppSettings();
Console.Read();
}
/// <summary>
/// 创建节点
/// </summary>
public static void CreateAppSettings()
{
int appStgCnt = ConfigurationManager.AppSettings.Count;
string newKey = "NewKey" + appStgCnt.ToString();
string newValue = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString();
config.AppSettings.Settings.Add(newKey, newValue);
config.Save(ConfigurationSaveMode.Modified);
//ConfigurationManager.RefreshSection("appSettings");
}
/// <summary>
/// 获得节点信息
/// </summary>
public static void GetAppSettings()
{
AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings");
Console.WriteLine(appSettingSection.SectionInformation.GetRawXml());
}
火星大能猫 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 isjoe 的回复:]

ConfigurationManager.RefreshSection 功能是刷新最新的配置内容。

配置文件默认首次读取,以后不会默认更改,
如果程序已经运行,这时你修改了配置文件,就必须调用该方法以刷新到最新修改。
[/Quote]
是的,这个一般是修改config文件后才会用到的方法.
whoyousee 2011-08-17
  • 打赏
  • 举报
回复
注释掉这句:
ConfigurationManager.RefreshSection(sectionName);
whoyousee 2011-08-17
  • 打赏
  • 举报
回复
我把这句注释:
Console.WriteLine(
appSettingSection.SectionInformation.GetRawXml());

得到的信息也是最新的啊?内容也随着:
config.AppSettings.Settings.Add(newKey, newValue);

改变而改变啊?
[Quote=引用 1 楼 isjoe 的回复:]
ConfigurationManager.RefreshSection 功能是刷新最新的配置内容。

配置文件默认首次读取,以后不会默认更改,
如果程序已经运行,这时你修改了配置文件,就必须调用该方法以刷新到最新修改。
[/Quote]
isjoe 2011-08-17
  • 打赏
  • 举报
回复
ConfigurationManager.RefreshSection 功能是刷新最新的配置内容。

配置文件默认首次读取,以后不会默认更改,
如果程序已经运行,这时你修改了配置文件,就必须调用该方法以刷新到最新修改。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧