首先说明,本文参考了这个帖子http://www.cnblogs.com/henw/archive/2012/01/31/2333783.html,进行了一些补充
简要说来两种方法,一是把config文件当做xml文件处理,这样可以使用DOM,也可以使用linq to xml,下面的代码使用了DOM:
private void SetValue(String AppKey,String AppValue) { XmlDocument xDoc=new XmlDocument(); xDoc.Load(System.Windows.Forms.Application.ExecutablePath+".config"); XmlNode xNode; XmlElement xElem1; XmlElement xElem2; xNode=xDoc.SelectSingleNode("configuration").SelectSingleNode("appSettings"); xElem1=(XmlElement)xNode.SelectSingleNode("add[@key='"+AppKey+"']"); if(xElem1!=null) xElem1.SetAttribute("value",AppValue); else { xElem2=xDoc.CreateElement("add"); xElem2.SetAttribute("key",AppKey); xElem2.SetAttribute("value",AppValue); xNode.AppendChild(xElem2); } xDoc.Save(System.Windows.Forms.Application.ExecutablePath+".config"); }
第二种就是使用.net提供System.Configuration
private void ChangeConfig() { Configuration cfa = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); //添加 cfa.AppSettings.Settings.Add("key", "test2"); //修改 cfa.AppSettings.Settings["test"].Value = "test"; cfa.Save(); }
第二种方法更简洁,不过再说下,这两种方法修改的都是程序生成目录下的后缀为.exe.config的文件,我上传一张我的试验项目的生成目录图
我们要修改的应该是MailFormApp.exe.Config这个文件,而不是项目里的app.config,一些初次接触config的人不了解,可能就会认为这两种方法都无效。
第一种指定了文件路径,而且是把config文件当文件来处理,调试和直接运行exe都能达到效果。然而使用C#提供的方法就要注意了,由于调试时程序运行在vs里头,vs是程序的宿主,所以直接F5调试的时候其实使用的是MailFormApp.vshost.exe和MailFormApp.vshost.exe.Config,所以是无法修改MailFormApp.exe.Config的。关于.vshost.exe.Config这个文件,经过我测试,调试时是先将.exe.Config文件内容copy到.vshost.exe.Config再读取该文件,所以调试时无法做到修改配置文件。但是如果直接双击运行目标exe,可以发现可以正确修改.exe.Config文件的,所以要注意不要因为在调试发现配置文件没有改误认为该方法无效。另外MailFormApp.vshost.exe只是用来寄宿在vs里头的,无法直接双击运行。