首先假设你的应用程序配置文件如下:

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

<configuration>

<appSettings>

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

</appSettings>

</configuration>

Ok,那么如何在运行时去修改name的值呢??

有很多童鞋会说可以使用Xml读取配置文件,然后xxx。。。。

当然这种方法肯定可以解决问题,有没有其他方法呢??

在这里我要介绍一种比较简单的方法,可能已经有人知道了,那就是使用ConfigurationManager类

ConfigurationManager 存在System.Configuration.dll 中。

代码如下:

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节点AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
    //删除name,然后添加新值appSettings.Settings.Remove("name");appSettings.Settings.Add("name", "new");//保存配置文件config.Save();
}

代码很简单:首先读取配置文件,接着获取appSettings节点,然后修改,接着保存。

运行:结果如下:

可以看到输出的值是两个old.

为什么??

查找msdn文档可以发现微软出于性能考虑,对ConfigurationManager采用了缓存策略,所以如果要读取新的值,应该使用ConfigurationManager的RefreshSection来进行刷新,

ConfigurationManager . RefreshSection:

刷新命名节,这样在下次检索它时将从磁盘重新读取它。

于是将Main方法修改为:

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

ChangeConfiguration();

ConfigurationManager.RefreshSection("appSettings");

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

重新清理解决方案,重新运行:

可以看到,仍然是两个old。。。

为什么?? 

难道值没有修改??,我们打开应用程序的配置文件,可以通过监视assemblyConfigFile获得路径

上面是xxx\bin\Debug\CAStudy.exe.,对应的配置文件就是CAStudy.exe.config

文件的内容如下:

可以发现value 值已经更改,那么为什么输出还是old,old 呢??

为了验证不是VS2010的问题。

首先手动将CAStudy.exe.config 文件中的value改为”old”,接着再次运行CAStudy.exe 结果如下:

可以看到输出时old,和new。为什么会这样???

难道调试时读取的不是修改的配置文件,或者修改的配置文件并不是调试的应用程序读取的文件??

在assemblyConfigFile 中设置断点,可以发现assemblyConfigFile 读取的是CAStudy.exe.Config。但是vs调试的时候运行的是CAStudy.vshost.exe。也就是说我们使用ConfigurationManager.OpenExeConfiguration 打开的是CAStudy.exe.config文件,但是我们调试的应用程序CAStudy.vshost.exe使用的是CAStudy.vshost.exe.config文件。

那么还有其他的方式可以准确的获取应用程序配置文件吗??

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

将ChangeConfiguration()方法修改如下:

private static void ChangeConfiguration()
{//读取程序集的配置文件string assemblyConfigFile = Assembly.GetEntryAssembly().Location;string appDomainConfigFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
     //获取appSettings节点AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings");
    
    //删除name,然后添加新值appSettings.Settings.Remove("name");appSettings.Settings.Add("name", "new");    //保存配置文件config.Save();
}

清理,重新运行:

使用默认的不传递字符串的版本就可以打开当前配置文件了。

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

如果要查看当前配置文件的完整路径可以使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

重新运行,结果如下:

另外值得一提的是:ConfigurationManager.RefreshSection 不支持section Group.所以对于WCF的服务,你必须一个一个的RefreshSection:

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

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

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

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

参考文章:How to Change .NET Configuration Files at Runtime (including for WCF)

动态修改App.Config 和web.Config相关推荐

  1. 在.NET中从app.config或web.config读取设置

    我正在使用一个C#类库,该类需要能够从web.config或app.config文件中读取设置(取决于DLL是从ASP.NET Web应用程序还是Windows Forms应用程序引用的). 我发现 ...

  2. ASP.NET一个网站内存放多个config文件(Web.Config文件中configSource 的用法

    ASP.NET一个网站内存放多个config文件(Web.Config文件中configSource 的用法) 2011年08月10日 星期三 上午 11:41 每个网站里都会有一个web.confi ...

  3. macOS app动态修改app图标,图标为icns格式

    1.macOS app动态修改app图标,图标为icns格式 //需要重启软件才能看见效果 -(void)ChangeAppIcon:(NSString *)icnsPath {if (![[NSFi ...

  4. iOS动态修改app图标

    动态修改app的图标,就是在不重新安装app的情况下,可以修改当前的icon图标:在某些情况下,是有这个需求的:例如,可以更换主题的app中,一般都会有一套完整的主题包含相应的icon:还有就是一些节 ...

  5. iOS动态修改app 图标(icon)

    作者:流火绯瞳 链接:https://www.jianshu.com/p/69313970d0e7 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. Demo地址 ht ...

  6. Android 动态修改app名称(市场和手机中显示两个不同的名称)

    默默接了一个黑科技的需求,需要在应用市场上,显示后缀,而手机上是应用原名(为了增加app的关键字搜索). 有些应用市场在你上传包后,是可以在后台修改app的显示名称的,例如下图: 但是有些市场是不能修 ...

  7. C#对App.config文件或者web.config文件中节点的操作类

    //============================================== //        FileName: ConfigManager //        Descrip ...

  8. 一个web.Config或app.Config自定义段configSections的示例

    一个web.Config或app.Config自定义段configSections的示例 越来越觉得,直接用配置文件app.Config或web.Config配置应用系统的运行参数,比自己做一个xml ...

  9. VS2005 ASP.NET2.0安装项目的制作(包括数据库创建、站点创建、IIS属性修改、Web.Config文件修改)

    站点: 如果新建默认的Web安装项目,那它将创建的默认网站下的一个虚拟应用程序目录而不是一个新的站点.故我们只有创建新的安装项目,而不是Web安装项目.然后通过安装类进行自定义操作,创建新站如下图: ...

  10. [转]一次.NET Web应用程序安装包的制作经历:Sql数据库安装的3种方式 配置IIS及Web.Config文件...

    本文转自:http://www.cnblogs.com/moonspell/archive/2007/07/27/832433.html 原文如下: -----------   一次难得的安装包制作经 ...

最新文章

  1. cuDNN 功能模块解析
  2. fetch-pack: unexpected disconnect while reading sideband packet fatal: early EOF fatal: fetch-pack:
  3. 新版 Edge 浏览器或将拥有两个不同的浏览器内核
  4. 空间金字塔池化_CVPR 2018 | 旷视科技人体姿态估计冠军论文——级联金字塔网络CPN...
  5. 计算机与人脑_看!自行车成精了...清华网红自行车:拥有“类人脑芯片”,可无人驾驶...
  6. Android开发经验实战总结
  7. 为啥程序员下班后只关显示器从不关电脑?看看各大网站的答案
  8. 学术检索产品比较分析
  9. iterm2上传文件到linux,在iTerm2中使用Zmodem实现快速传输文件
  10. I/O error on GET request for http://userservice/user/point/update: userservice; nested exception
  11. 浏览器播放视频时蓝牙耳机自动关机
  12. Luogu P4246 [SHOI2008]堵塞的交通(线段树+模拟)
  13. VISIO取消箭头自动吸附及粘连
  14. IDEA中如何实现git的cherry-pick可视化操作?
  15. 和平精英显示模拟服务器已满,和平精英模拟器注册已经达到了上限怎么办?原因及解决方法分享...
  16. Error —— 单元测试中如何Mock application文件中的数据?
  17. 屏蔽百度广告,百度新闻
  18. YC1090货车驱动桥的结构设计(有cad图)
  19. Java压缩文件和文件夹为zip格式
  20. NasNet实践:图像识别领域最佳模型

热门文章

  1. Xcode12 “PushKit apps that use VoIP push must link either CallKit or IncomingCallNotifications
  2. Linux下读写UART串口的代码
  3. UDP网络程序,客户端和服务端交互原理
  4. 实现一个进度条的打印
  5. oracle vm突然黑屏了
  6. Dnsmasq 安装配置
  7. 2015.03.20使命
  8. C++ 编写 CorelDRAW CPG 插件例子(1)—WelcomeScreen
  9. android 设置系统屏幕亮度
  10. R资讯| 广州R会第三批嘉宾揭晓!!