在运行时更改App.config

我正在为我们正在开发的系统编写一个测试WinForms / C#/ .NET 3.5应用程序,我们不需要在运行时切换.config文件,但这实际上是一场噩梦。

这是场景:WinForms应用程序旨在测试WebApp,分为5个子系统。 测试过程适用于在子系统之间发送的消息,并且为了使该过程成功,每个子系统都必须拥有自己的.config文件。

对于我的测试应用程序,我写了5个单独的配置文 我希望我能够在运行时在这5个文件之间切换,但问题是:我可以编程方式编辑应用程序.config文件很多次,但这些更改只会生效一次。 我一直在寻找一个表格来解决这个问题,但我仍然没有成功。

我知道问题定义可能有点令人困惑,但如果有人帮助我,我会非常感激。

提前致谢!

—更新01-06-10 —

我之前没有提到过。 最初,我们的系统是一个Web应用程序,每个子系统之间都有WCF调用。 出于性能测试的原因(我们使用ANTS 4),我们必须创建程序集的本地副本并从测试项目中引用它们。 听起来有点不对劲,但我们找不到令人满意的方法来衡量远程应用程序的性能。

—结束更新—

这就是我正在做的事情:

public void UpdateAppSettings(string key, string value) { XmlDocument xmlDoc = XmlDocument.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); foreach (XmlElement item in xmlDoc.DocumentElement) { foreach (XmlNode node in item.ChildNodes) { if (node.Name == key) { node.Attributes[0].Value = value; break; } } } xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); System.Configuration.ConfigurationManager.RefreshSection("section/subSection"); } 

UPDATE

下面的解决方案不起作用,因为XmlDocument没有处理,似乎某些版本的.net在给定文件路径时没有正确关闭。 解决方案(链接中的示例代码)是打开一个流,它将执行一个dispose并将该流传递给save函数。

这里显示了一个解决方案。 http://web-beta.archive.org/web/20150107004558/www.devnewsgroups.net/group/microsoft.public.dotnet.xml/topic40736.aspx


下面的旧东西

试试这个:

注意,我改为xpath,但它已经有一段时间了,所以我可能得到了错误的xpath,但无论如何你应该使用xpath而不是走树。 你可以看到它更清晰。

重要的一点是将using dispose()using语句,我认为这是你的问题。

让我知道,祝你好运。

  public void UpdateAppSettings(string key, string value) { using (XmlDocument xmlDoc = new XmlDocument()) { xmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); xmlDoc.DocumentElement.FirstChild.SelectSingleNode("descendant::"+key).Attributes[0].Value = value; xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile); } System.Configuration.ConfigurationManager.RefreshSection("section/subSection"); } 

我知道这是一个很老的线程,但我无法使列出的方法起作用。 这是UpdateAppSettings方法的更简单版本(使用.NET 4.0):

 private void UpdateAppSettings(string theKey, string theValue) { Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); if (ConfigurationManager.AppSettings.AllKeys.Contains(theKey)) { configuration.AppSettings.Settings[theKey].Value = theValue; } configuration.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("appSettings"); } 

非常易读并且避免使用Xpath等遍历app.config。 注意:上面的代码的灵感来自MSDN上的这个代码段。

我的猜测是你第一次没有关闭文件句柄,所以windows不会“看到”你进行后期更改。

我的建议是使用API​​调用IIS并关闭Web应用程序(和池),进行更改,打开Web应用程序。 这样您就可以确保它会重新读取文件,并为每个测试提供“干净”的环境。

假设在读取和处理配置文件后关闭配置文件的文件句柄,我会向应用程序发送一条消息,告诉它在更新文件后重新读取配置文件。 如果这种方法不起作用,那么我怀疑(正如Hogan建议的那样)文件句柄没有关闭。 您从文件打开,读取和关闭系统调用获得了什么错误代码? (使用perror报告错误消息)