在wpf项目中在运行时更改或更新app.config

时间:2011-11-10 18:43:45

标签: wpf vb.net wcf clickonce

我们如何在运行时覆盖配置文件。我有四个配置文件用于DEV,TEST,UAT,PROD。根据用户选择,我需要使用其中一个选择特定的配置文件完全覆盖默认配置文件。这些配置文件不仅具有appsettings部分,而且还具有复杂的cutom部分和具有许多属性的子元素。我需要在运行时动态地覆盖和刷新章节。我知道有很多关于编辑appsettings部分的文章。但我想完全覆盖整个文件。您对VB.net的帮助表示赞赏。

我有自定义部分:

1 个答案:

答案 0 :(得分: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(...)加载的单例实例。

我意识到加载配置代码的前景是你想要的最后一件事,但它可以让你在配置文件中清楚地定义和隔离你的环境变量。