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

9

在运行时,是否有一种方法可以切换应用程序的app.config(从current.config到new.config,文件对文件)。我有一个备份/恢复过程,需要替换自己的application.exe.config文件。我看到了这篇文章,但它没有回答如何在运行时完成此操作。

5个回答

10

结果发现我可以将新的 .config 文件替换掉旧的,然后对每个部分使用 ConfigurationManager.RefreshSection(...)。这样它就会从新的 .config 文件进行更新。


5

Microsoft .NET的app.config并不适用于您的场景,也不适用于许多其他场景。我经常遇到类似的需求,因此我花了很大努力设计了一种解决方案。

  1. 重新设计只使用app.config作为配置引导:指定其余真实配置数据的位置。这些信息几乎永远不会改变,因此无需处理文件监视或应用程序重启。

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

  3. 实现一个简单的库来封装你的配置访问,这样你就有了一个简单的API供应用程序其余部分使用(通过依赖注入)。隐藏app.config的使用以及你的真实配置存储位置。由于.NET是强类型的,所以将每个检索到的字符串转换为最具体的类型(URL、Int32、FileInfo等)。

  4. 确定哪些配置设置可以在运行时安全更改,哪些配置不能。通常,某些设置需要随其他设置更改,或者根本不允许更改它们。如果您的所有配置数据都可以安全更改,则事情就变得很容易,但我非常怀疑这种情况。尽可能隐藏配置设置的可更改性和相互依赖性。

  5. 设计对真实配置数据不可用的响应。我喜欢将任何配置设置的缺失视为致命错误,会中止应用程序,除非我能够确定可用的默认值。同样,在没有配置存储容器(文件、数据库表等)的情况下,我也会中止应用程序。

享受您的应用程序,并祝您一切顺利。


2
当您需要切换文件时,您能否在检测到这一需求时重新启动应用程序?如果可以的话,只需要切换文件并重新启动即可。现在,棘手的问题是 .NET 是否在程序运行时保持 app.config 文件处于打开状态。我怀疑它不会,但如果最显然的方法失败了,我建议您有第二个应用程序(cfgswitcher.exe),它等待命令行上指定的 PID 的进程终止,然后切换配置文件并重新启动原始进程。然后,您的应用程序只需要启动 cfgswitcher.exe(传递自己的 PID 作为命令行参数)并终止即可。
正如我所说的,首先尝试更明显的方法是值得的。
编辑:如果您无法重新启动应用程序(甚至是其中的一部分),那么无法更改 app.config 的各个方面(如程序集绑定等)。如果您只对自己的配置部分感兴趣,则建议将其存储在单独的配置文件中,并在需要时重新加载。

我无法重新启动应用程序。 - maxfridbe

0

查看ApplicationSettingsBase类中可用的事件。其中包括PropertyChanged和SettingChanging,可能会给您所需的内容。

您还可以监视文件,如果文件已更改,则调用reload方法以获取新的设置。


0

我认为在不重启的情况下动态切换配置是不可能的,所以如果您无法采用Jon的方法,您应该尝试提出其他方案。

无论如何,也许只是我对您的情况缺乏足够的信息,但这种方式有些可疑。

您确定更换配置文件是实现您需要满足的任何要求最好的方法吗?我的意思是,这是非常不寻常的事情。如果我是您,我会尝试想出其他方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接