不同的应用程序设置取决于配置模式

时间:2010-06-22 04:39:28

标签: c# .net vb.net settings appsettings

是否有人知道我可以在.Net应用程序中设置以应用程序当前开发模式为条件的应用程序(或用户)级别设置? IE:调试/发布

更具体地说,我有一个url引用我的应用程序设置中保存的webservices。在发布模式期间,我希望这些设置在调试模式期间指向http://myWebservice.MyURL.com我希望这些设置为http://myDebuggableWebService.MyURL.com

有什么想法吗?

5 个答案:

答案 0 :(得分:16)

这对派对来说有些晚了,但我偶然发现了一种为web.transform文件实施app.config方法的好方法。 (即它使用命名空间http://schemas.microsoft.com/XML-Document-Transform

我认为这是"很好"因为它是一种纯xml方法,并且不需要第三方软件。

  • 根据您的各种构建配置,父/默认App.config文件来自。
  • 这些后代只会覆盖他们需要的东西。

在我看来,这比必须保持x个完整复制的配置文件的数量要复杂得多,比如在其他答案中。

此处发布了演练: http://mitasoft.wordpress.com/2011/09/28/multipleappconfig/


看,妈妈 - 我的IDE中没有明确的构建后事件!

答案 1 :(得分:6)

据我所知,没有内置的方法可以做到这一点。在我们的项目中,我们维护了4个不同的设置文件,并通过在构建的预构建步骤中将每个文件复制到活动文件中来切换它们。

copy "$(ProjectDir)properties\settings.settings.$(ConfigurationName).xml" "$(ProjectDir)properties\settings.settings"
copy "$(ProjectDir)properties\settings.designer.$(ConfigurationName).cs" "$(ProjectDir)properties\settings.Designer.cs"

这对我们来说几年来一直运作良好。只需更改目标,也可以切换整个配置文件。

修改:这些文件的名称为: settings.settings.Debug.xmlsettings.settings.Release.xm等等。

Scott Hanselman描述了一种稍微“聪明”的方法,唯一的区别是我们没有检查文件是否已经改变: http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

答案 2 :(得分:4)

如果要将所有内容保存在一个配置文件中,可以在app.settings中引入自定义配置部分,以存储调试和发布模式的属性。

您可以在应用中保留存储开发模式特定设置的对象,也可以根据调试开关覆盖现有的应用程序设置。

这是一个简短的控制台应用程序示例(DevModeDependencyTest):

App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="DevModeSettings">
      <section name="debug" type="DevModeDependencyTest.DevModeSetting,DevModeDependencyTest" allowLocation="true" allowDefinition="Everywhere" />
      <section name="release" type="DevModeDependencyTest.DevModeSetting,DevModeDependencyTest" allowLocation="true" allowDefinition="Everywhere" />
    </sectionGroup>
  </configSections>
  <DevModeSettings>
    <debug webServiceUrl="http://myDebuggableWebService.MyURL.com" />
    <release webServiceUrl="http://myWebservice.MyURL.com" />
  </DevModeSettings>
  <appSettings>
    <add key="webServiceUrl" value="http://myWebservice.MyURL.com" />
  </appSettings>
</configuration>

存储自定义配置的对象(DevModeSettings.cs):

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace DevModeDependencyTest
{
    public class DevModeSetting : ConfigurationSection
    {
        public override bool IsReadOnly()
        {
            return false;
        }

        [ConfigurationProperty("webServiceUrl", IsRequired = false)]
        public string WebServiceUrl
        {
            get
            {
                return (string)this["webServiceUrl"];
            }
            set
            {
                this["webServiceUrl"] = value;
            }
        }
    }
}

访问自定义配置设置的处理程序(DevModeSettingsHandler.cs):

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace DevModeDependencyTest
{
    public class DevModeSettingsHandler
    {
        public static DevModeSetting GetDevModeSetting()
        {
            return GetDevModeSetting("debug");
        }

        public static DevModeSetting GetDevModeSetting(string devMode)
        {
            string section = "DevModeSettings/" + devMode;

            ConfigurationManager.RefreshSection(section); // This must be done to flush out previous overrides
            DevModeSetting config = (DevModeSetting)ConfigurationManager.GetSection(section);

            if (config != null)
            {
                // Perform validation etc...
            }
            else
            {
                throw new ConfigurationErrorsException("oops!");
            }

            return config;
        }
    }
}

最后你的入口指向控制台应用程序(DevModeDependencyTest.cs):

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace DevModeDependencyTest
{
    class DevModeDependencyTest
    {
        static void Main(string[] args)
        {
            DevModeSetting devMode = new DevModeSetting();

            #if (DEBUG)
                devMode = DevModeSettingsHandler.GetDevModeSetting("debug");
                ConfigurationManager.AppSettings["webServiceUrl"] = devMode.WebServiceUrl;
            #endif

            Console.WriteLine(ConfigurationManager.AppSettings["webServiceUrl"]);
            Console.ReadLine();
        }
    }
}

答案 3 :(得分:3)

SlowCheetah不仅为App.config添加了您要求的功能,还为项目中的任何XML文件添加了所需的功能 - http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

答案 4 :(得分:1)

我有一个类似的问题要解决并最终使用XDT(web.config)转换引擎,这已在ne1410s的答案中提出,可在此处找到:https://stackoverflow.com/a/27546685/410906

但是,不是像他的链接中所描述的那样手动操作,而是使用了这个插件:https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

该插件仅帮助设置配置,不需要构建,并且可以在其他计算机或构建服务器上构建解决方案,而无需插件或任何其他工具。