有没有办法在运行时切换应用程序 app.config(current.config 到 new.config,文件对文件)。我有一个备份/恢复过程,需要替换它自己的 application.exe.config 文件。我看过这篇文章,但它没有回答如何在运行时执行此操作。
5 回答
结果我可以将 .config 文件换成新的,并为每个部分执行 ConfigurationManager.RefreshSection(...) 。它将从新的 .config 文件更新。
Microsoft .NETapp.config
不是为您的方案以及许多其他方案而设计的。我经常遇到类似的需求,所以我花了很多精力设计一个解决方案。
重新设计以
app.config
仅用作配置引导程序:指定在哪里可以找到其余的真实配置数据。此信息几乎永远不会改变,因此无需处理文件监视或应用程序重新启动。为真实的配置数据选择一个备用位置:一个文件、一个数据库,甚至可能是一个 Web 服务。大多数时候我更喜欢数据库,所以我创建了一个结构简单的配置表,允许我存储我的数据。
实现一个简单的库来包装您的配置访问,以便您为应用程序的其余部分提供一个简单的 API(通过依赖注入)。隐藏使用
app.config
以及您的真实配置存储位置。由于 .NET 是强类型的,因此进行配置设置 - 将检索到的每个字符串转换为最具体的可用类型(URL、Int32、FileInfo 等)。确定哪些配置设置可以在运行时安全地更改,哪些不能。通常,某些设置需要与其他设置一起更改,或者根本没有任何意义允许它们更改。如果您的所有配置数据都可以在运行时安全地更改,那么这会使事情变得容易,但我非常怀疑这种情况。尽可能隐藏配置设置的可变性和相互依赖性。
设计对真实配置数据不可用的响应。我更愿意将缺少任何配置设置视为中止应用程序的致命错误,除非我可以确定可用的默认值。同样,我在没有配置存储容器(文件、数据库表等)的情况下中止。
享受,并祝愿。
当您检测到需要切换文件时,您是否能够重新启动应用程序?如果是这样,只需切换文件并重新启动即可。现在,棘手的一点是,如果.NET 在程序运行时保持 app.config 文件处于打开状态。我怀疑它没有,但如果最明显的方法失败了,我建议你有第二个应用程序(cfgswitcher.exe)等待在命令行中指定 PID 的进程终止,然后切换配置文件并重新启动原流程。然后您的应用程序只需要启动 cfgswitcher.exe(将其自己的 PID 作为命令行参数传递)并终止。
正如我所说,首先尝试更明显的方法是值得的。
编辑:如果您无法重新启动应用程序(甚至无法在新的 AppDomain 中重新启动应用程序的一部分),则无法更改 app.config 的各个方面(程序集绑定等)。如果您只对更改自己的配置部分感兴趣,那么我建议您将它们存储在单独的配置文件中,并在需要时重新加载它们。
查看 ApplicationSettingsBase 类上可用的事件。有 PropertyChanged 和 SettingChanging 可能会给你你需要的东西。
您还可以查看文件,如果它已更改,请调用 reload 方法以获取新设置。
我认为根本不可能在不重启的情况下在运行时切换配置,所以如果你不能应用 Jon 的方法,你应该尝试想出另一种方法。
无论如何,也许只是我对你的场景没有足够的信息,但这种感觉很可疑。
您确定交换配置文件是实现您需要满足的任何要求的最佳方式吗?我的意思是,这是一件非常罕见的事情。如果我是你,我会尝试想出一些其他的方法。