2010-06-22 5 views
12

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

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

Любые идеи?

+0

Спасибо, hhravn! –

ответ

5

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

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

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(); 
     } 
    } 
} 
14

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

  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 
    } 
    

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

3

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

+1

Хотя это может теоретически ответить на вопрос, [было бы предпочтительно] (http://meta.stackexchange.com/q/8259) включить сюда основные части ответа и предоставить ссылку для справки. – Spontifixus

+0

Я думаю, что это, пожалуй, лучший ответ - кажется, что конфигурация per-build для преобразования app.config (как и сборка в преобразованиях web.config). –

12

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

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

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

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

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


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

+0

Cheers mate отлично работает! – petric

0

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

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

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

Смежные вопросы