【问题标题】:Is switching app.config at runtime possible?可以在运行时切换 app.config 吗?
【发布时间】:2010-10-01 00:06:18
【问题描述】:

有没有办法在运行时切换应用程序 app.config(current.config 到 new.config,文件对文件)。我有一个备份/恢复过程,需要替换它自己的 application.exe.config 文件。我看过这个post,但它没有回答如何在运行时执行此操作。

【问题讨论】:

    标签: c# runtime app-config


    【解决方案1】:

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

    1. 重新设计以仅将app.config 用作配置引导程序:指定在哪里可以找到其余的真实配置数据。此信息几乎永远不会改变,因此无需处理文件监视或应用程序重启。

    2. 为真实的配置数据选择一个备用位置:一个文件、一个数据库,甚至可能是一个 Web 服务。大多数时候我更喜欢数据库,所以我创建了一个结构简单的配置表,让我可以存储我的数据。

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

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

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

    享受,并祝愿。

    【讨论】:

      【解决方案2】:

      原来我可以将 .config 文件换成新的,并为每个部分执行 ConfigurationManager.RefreshSection(...)。它将从新的 .config 文件更新。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          查看 ApplicationSettingsBase 类上可供您使用的事件。有 PropertyChanged 和 SettingChanging 可以满足您的需求。

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

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

            • 我无法重新启动应用程序。
            猜你喜欢
            • 2018-02-06
            • 2012-09-14
            • 2020-10-22
            • 1970-01-01
            • 2011-01-27
            • 2017-12-01
            • 2013-05-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多