在WPF程序运行时动态修改app.config文件后如何立即生效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在WPF程序运行时动态修改app.config文件后如何立即生效相关的知识,希望对你有一定的参考价值。

我需要在程序运行时动态的修改app.config文件,立即生效不用重启程序。现在用ConfigurationManager可以在app.config中写入新的值,但是必须要重启程序才能生效。我的代码如下:
<configuration>
<appSettings>
<add key="name" value="old"/>
</appSettings>
</configuration>
private void button1_Click(object sender, RoutedEventArgs e)

Console.WriteLine(ConfigurationManager.AppSettings["name"]);
ChangeConfiguration();
//刷新appSettings
ConfigurationManager.RefreshSection("appSettings");
Console.WriteLine(ConfigurationManager.AppSettings["name"]);

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();

现在是输出old old
怎么才能输出 old new,

参考技术A 你在config.Save() 后加这句试试:
ConfigurationManager.RefreshSection("appSettings");追问

不是这个原因,把debug文件夹里的xxx.exe.vshost.config删除就好了

参考技术B AppDomain.CurrentDomain.BaseDirectory

使用 NUnit 时,我应该如何在运行时修改 app.config?

【中文标题】使用 NUnit 时,我应该如何在运行时修改 app.config?【英文标题】:How should I modify app.config at runtime when using NUnit? 【发布时间】:2013-12-06 11:13:27 【问题描述】:

我有一个正在测试控制台应用项目的 NUnit 测试项目。控制台应用程序项目大量使用 app.config 文件。从我的 NUnit 测试项目运行测试时,被测试的代码使用我的 Tests.dll.config 文件中的配置值。该文件位于我的测试项目的根目录中,是被测试应用的 app.config 文件的副本。

但是,在某些测试中,我需要更改某些配置设置的值。我一直在我的 Nunit 测试中使用它来做到这一点:

ConfigurationManager.AppSettings.Set("SettingKey" , "SettingValue");

我不希望我在一个测试中所做的这些运行时配置更改干扰或被任何其他测试看到。这是正确的方法吗?

更新 我还应该提到我的测试是并行运行的。我认为这是因为我正在使用 Re-sharper。 因此,如果我在一个测试中更改配置,我认为它可能会在另一个测试中更改配置,这是我不想要的。

【问题讨论】:

【参考方案1】:

是否可以在接口中包装代码读取配置? 例如:

public interface IAppSettings

   string Get(string settingKey);

因此您可以轻松地从 app.settings 文件中抽象出来。 然后在您的 NUnit 项目中,您可以通过一个简单的类实现 IAppSettings 并配置您的应用程序以使用它。在这种情况下,您无需阅读真正的 app.config 文件,并且可以轻松更改配置。它还将加快您的测试速度。

【讨论】:

谢谢。我可能会这样看。【参考方案2】:

您似乎对集成测试而不是单元测试感兴趣。原因是您的测试需要访问配置文件修改一些值,以便您的测试可以正确运行。

您说过您不希望您的运行时配置更改干扰其他测试。 处理这个问题的最好方法是使用 NUnit 内置的测试初始化​​和拆除方法。

例如,您可以使用 A. NUnit [setup] 属性对您的配置进行运行时更改

B. NUnit [teardown] 属性回滚你所做的更改

查看更多信息 http://www.nunit.org/index.php?p=setup&r=2.2.10

请注意,您班级中的每个测试都将运行上述设置/拆卸序列。

因此,如果您需要更多自定义方法,您可以简单地创建自己的设置方法,并在断言调用拆卸方法以清理/回滚您在设置方法中所做的事情之后,从您需要的测试中调用它。这样,它只会影响您需要它来更改配置值的测试。

例如(在伪代码中)

Public void Mytestmethod()
       Call my own test init
       Call SUT
       Perform Any asserts
       Call My own tear down

【讨论】:

问题是 Resharper 并行运行我的测试,所以我猜在一个测试初始化​​中更改配置可能会影响另一个测试? 不,我不这么认为。 Evern ReShaper 并行运行它们,您的测试上下文与测试本身隔离。所以我提到的 Setup/Teardown 或自定义方法应该没有效果。我们确实在我的工作环境中运行这样的 R# 测试。

以上是关于在WPF程序运行时动态修改app.config文件后如何立即生效的主要内容,如果未能解决你的问题,请参考以下文章

VS动态修改App.config中遇到的坑(宿主进程问题)

WPF程序中App.Config文件的读与写

c# WinForm 我修改App.Config保存后会自动弹出对话框,怎么让它自动选择“全部”保存

C#如何动态修改app.config配置文件?

c# - 在运行时更改 App.Config 后,实体框架 ConnectionString 不会更新

如何在 WPF 应用程序中使用 App.config 进行 log4net 配置