Различные настройки приложения в зависимости от режима конфигурации
Кто-нибудь знает, как я могу установить настройки уровня приложения (или пользователя) в приложении.Net, которые зависят от текущего режима разработки приложений? IE: отладка / выпуск
Чтобы быть более конкретным, у меня есть URL-ссылка на мои веб-сервисы в настройках приложения. В режиме выпуска я хотел бы, чтобы эти настройки указывали на http://mywebservice.myurl.com/ в режиме отладки мне бы хотелось, чтобы эти настройки были http://mydebuggablewebservice.myurl.com/.
Есть идеи?
6 ответов
Я знаю, что об этом спрашивали много лет назад, но на всякий случай кто-то ищет простое и эффективное решение, которое я использую.
Перейдите в свойства проекта, вкладку "Настройки" (вы увидите 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 }
Теперь, когда вы запускаете ваш проект, он будет компилировать только строку, соответствующую текущей конфигурации сборки.
Это немного поздно для вечеринки, но я наткнулся на хороший способ реализации 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 разных файла настроек и переключаемся между ними, копируя каждый в активный файл на этапе предварительной сборки сборки.
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
Если вы хотите сохранить все в одном файле конфигурации, вы можете добавить в ваш 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();
}
}
}
SlowCheetah добавляет функциональность, которую вы запрашиваете, не только для App.config, но и для любого XML-файла в вашем проекте - http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5
Мне пришлось решить аналогичную проблему, и в итоге я использовал механизм преобразования XDT (web.config), который уже был предложен в ответе ne1410s, который можно найти здесь: /questions/1635374/razlichnyie-nastrojki-prilozheniya-v-zavisimosti-ot-rezhima-konfiguratsii/1635391#1635391
Но вместо того, чтобы делать это вручную, как описано в его ссылке, я использовал этот плагин: https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859
Плагин только помогает настроить конфигурацию, его не нужно собирать, и решение может быть построено на других машинах или на сервере сборки без использования плагина или каких-либо других инструментов.