【问题标题】:changing or updating app.config at runtime in wpf projects在 wpf 项目中在运行时更改或更新 app.config
【发布时间】:2011-11-10 18:43:44
【问题描述】:
我们如何在运行时覆盖配置文件。我有四个用于 DEV、TEST、UAT、PROD 的配置文件。根据用户选择,我需要使用特定于选择的配置文件之一完全覆盖默认配置文件。这些配置文件不仅有 appsettings 部分,而且还有复杂的切割部分和具有很多属性的子元素。我需要在运行时动态覆盖和刷新部分。我知道有很多关于编辑 appsettings 部分的文章。但我想完全覆盖整个文件。感谢您对 VB.net 的帮助。
我有自定义部分:
【问题讨论】:
标签:
wpf
vb.net
wcf
clickonce
【解决方案1】:
使用 ClickOnce,我认为您不能也不应该更改安装文件夹中的文件,因为它是只读的...因此,您可以选择:使用 MSI 安装和自定义安装操作来切换适当的配置文件或构建一些自定义配置元素来封装您的不同环境。
在我们的应用程序中,我们已经完成了后者。我们的主 app.config 中有类似以下自定义配置部分的内容。
<myApp defaultEnvironmentName="prod">
<environments>
<add name="prod" title="Production" description="Full production environment" injectionContainers="prod">
...
<!-- Add custom elements the affect your environment -->
...
</add>
<add name="qa" title="Quality Assurance" description="Full production environment except running off our mock database" injectionContainers="prod qa">
...
<!-- Add custom elements the affect your environment -->
...
</add>
</environments>
</myApp>
... <!-- Other elements that are common to all environments --> ...
然后我们使用run-time flag or command line argument 使您能够轻松地在环境之间切换。正在使用的环境值存储在用户设置文件中,以便在后续使用时应用程序将加载上次使用的环境。
当我们需要访问因环境而异的内容时,我们直接调用自定义配置部分的 CurrentEnvironment 属性,该属性利用上述设置来解决问题:
var title = MyAppSection.Configured.CurrentEnvironment.Title;
注意这里,MyAppSection.Configured 只是一个基于ConfigurationManager.GetSection(...) 加载的单例实例。
我意识到大量配置代码的前景是您最不想要的,但它可以让您在配置文件中清楚地定义和隔离您的环境变量。