Различные настройки приложения в зависимости от режима конфигурации - PullRequest
15 голосов
/ 22 июня 2010

Кто-нибудь знает, как я могу установить настройки уровня приложения (или пользователя) в приложении .Net, которые зависят от текущего режима разработки приложений? IE: отладка / выпуск

Если быть более точным, у меня есть ссылка на мои веб-сервисы в настройках приложения. В режиме выпуска я хотел бы, чтобы эти настройки указывали на http://myWebservice.MyURL.com, в режиме отладки я бы хотел, чтобы эти настройки были http://myDebuggableWebService.MyURL.com.

Есть идеи?

Ответы [ 6 ]

17 голосов
/ 18 декабря 2014

Это немного поздно для вечеринки, но я наткнулся на хороший способ реализации подхода web.transform для app.config файлов. (т.е. он использует пространство имен http://schemas.microsoft.com/XML-Document-Transform)

Я думаю, что это "хорошо", потому что это чисто XML-подход и не требует стороннего программного обеспечения.

  • Родительский файл / файл по умолчанию App.config происходит от, в зависимости от ваших различных конфигураций сборки.
  • Эти потомки тогда переопределяют только то, что им нужно.

На мой взгляд, это гораздо сложнее и надежнее, чем необходимость поддерживать x количество файлов конфигурации, которые копируются полностью, например, в других ответах.

Пошаговое руководство опубликовано здесь: http://mitasoft.wordpress.com/2011/09/28/multipleappconfig/


Смотри, мама - в моей IDE нет явных событий после сборки!

15 голосов
/ 19 сентября 2012

Я знаю, что об этом спрашивали годы назад, но на всякий случай кто-то ищет простое и эффективное решение, которое я использую.

  1. Перейдите в свойства проекта, вкладку «Настройки» (вы увидите URL вашего веб-сервиса или любые другие параметры, уже перечисленные здесь).

  2. Нажмите кнопку «Просмотр кода», доступную на странице настроек.

  3. Введите это в конструкторе.

    this.SettingsLoaded += Settings_SettingsLoaded;
    
  4. Добавьте следующую функцию под конструктор:

    void Settings_SettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e)
    {
        #if(DEBUG)
        this["YOUR_SETTING_NAME"] = VALUE_FOR_DEBUG_CONFIGURATION;
        #else
        this["YOUR_SETTING_NAME"] = VALUE_FOR_RELEASE_CONFIGURATION;
        #endif
    }
    

Теперь, когда вы запускаете ваш проект, он будет компилировать только строку, соответствующую текущей конфигурации сборки.

6 голосов
/ 22 июня 2010

Насколько я знаю, нет никакого способа сделать это. В нашем проекте мы поддерживаем 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.xml, settings.settings.Release.xm л и т. Д.

Скотт Хансельман описал слегка «умный» подход, единственное отличие в том, что у нас нет проверки, чтобы увидеть, изменился ли файл: http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

4 голосов
/ 22 июня 2010

Если вы хотите сохранить все в одном файле конфигурации, вы можете добавить пользовательский раздел конфигурации в ваш 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 голосов
/ 28 января 2013

SlowCheetah добавляет функциональность, которую вы запрашиваете, не только для App.config, но и для любого XML-файла в вашем проекте - http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

1 голос
/ 10 февраля 2016

Мне пришлось решить аналогичную проблему, и в итоге я использовал механизм преобразования XDT (web.config), который уже был предложен в ответе ne1410s, который можно найти здесь: https://stackoverflow.com/a/27546685/410906

Но вместо этогоделать это вручную, как описано в его ссылке, я использовал этот плагин: https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

Плагин помогает только настроить конфигурацию, его не нужно создавать, и решение может быть построено на других машинах или напостроить сервер без плагина или других необходимых инструментов.

...