Подтвердить что ты не робот

Различные настройки приложения в зависимости от режима конфигурации

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

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

Любые идеи?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

  • Нажмите кнопку "Просмотреть код", доступную на странице настроек.

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

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

    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
    }
    

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

Ответ 3

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

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

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

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

Здесь вы найдете пошаговое руководство: http://mitasoft.wordpress.com/2011/09/28/multipleappconfig/


Посмотрите, мама. Нет явных событий после сборки в моей среде IDE!

Ответ 4

Если вы хотите сохранить все в одном файле конфигурации, вы можете ввести пользовательский раздел конфигурации в свой app.settings для хранения свойств для режимов отладки и выпуска.

Вы можете либо сохранить объект в своем приложении, который хранит определенные настройки режима dev, либо переопределить существующее приложение, основанное на переключателе отладки.

Вот пример консольного приложения (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();
        }
    }
}

Ответ 6

У меня возникла аналогичная проблема для решения проблемы и в результате я использовал механизм преобразования XDT (web.config), который уже был предложен в ответе от ne1410s, который можно найти здесь: fooobar.com/info/253722/...

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

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