是否可以在运行时切换app.config?

有没有办法在运行时切换应用程序app.config(current.config到new.config,文件为文件)。 我有一个备份/恢复过程,需要替换自己的application.exe.config文件。 我已经看过这篇文章,但它没有回答如何在运行时这样做。

事实certificate,我可以将.config文件替换为新文件,并为每个部分执行ConfigurationManager.RefreshSection(…)。 它将从新的.config文件更新。

Microsoft .NET的app.config不是为您的场景以及许多其他场景设计的。 我经常遇到类似的需求,因此我花了很多精力设计解决方案。

  1. 重新设计为仅将app.config用作配置引导程序:指定在何处查找其他实际配置数据。 此信息几乎不会更改,因此无需处理文件监视或应用程序重新启动。

  2. 选择真实配置数据的备用位置:文件,数据库,甚至是Web服务。 我大多数时候都喜欢数据库,因此我创建了一个配置表,其结构简单,允许我存储我的数据。

  3. 实现一个简单的库来包装您的配置访问,以便为您的应用程序的其余部分提供一个简单的API(通过dependency injection)。 隐藏app.config的使用以及您的实际配置存储位置。 由于.NET是强类型的,因此请进行配置设置 – 将检索到的每个字符串转换为可用的最具体类型(URL,Int32,FileInfo等)。

  4. 确定在运行时可以安全地更改哪些配置设置与不能更改的配置设置。 通常,某些设置需要与其他设置一起更改,或者根本不允许它们进行更改。 如果所有配置数据都可以在运行时安全地更改,那么这会让事情变得简单,但我强烈怀疑这种情况。 尽可能隐藏配置设置的可变性和相互依赖性。

  5. 设计对实际配置数据不可用的响应。 我更喜欢将缺少任何配置设置视为中止应用程序的致命错误,除非我可以识别可用的默认值。 同样,我在没有配置存储容器(文件,数据库表等)的情况下中止。

享受,祝福。

当您检测到需要切换文件时,是否能够重新启动应用程序? 如果是这样,只需切换文件并重新启动即可。 现在,棘手的一点是, 如果 .NET在程序运行时保持app.config文件打开。 我怀疑它没有,但如果最明显的方法失败,我建议你有第二个应用程序(cfgswitcher.exe)等待进程,在命令行上指定的PID终止,然后切换配置文件并重新启动原始过程。 然后你的应用程序只需要启动cfgswitcher.exe(传递自己的PID作为命令行参数)并终止。

正如我所说,首先尝试更明显的方法是值得的。

编辑:如果您无法重新启动应用程序(或甚至是新的AppDomain中的一部分),则无法更改app.config(程序集绑定等)的各个方面。 如果您只对自己的配置部分更改感兴趣,那么我建议您将它们存储在单独的配置文件中,并在需要时重新加载它们。

查看ApplicationSettingsBase类上可用的事件。 PropertyChanged和SettingChanging可以为您提供所需。

您还可以查看该文件,如果已更改,请调用重新加载方法以获取新设置。

我认为根本不可能在没有重新启动的情况下在运行时切换配置,所以如果你不能应用Jon的方法,你应该尝试提出另一种方法。

无论如何,也许只是我没有足够的关于你的场景的信息,但这种感觉很可疑。

您确定交换配置文件是实现您需要满足的任何要求的最佳方式吗? 我的意思是,这是一个非常罕见的事情。 如果我是你,我会尝试提出其他方法。