Различные настройки приложения в зависимости от режима конфигурации
Кто-нибудь знает, каким образом я могу установить настройки уровня приложения (или пользователя) в приложении .Net, которые обусловлены текущим режимом разработки приложений? IE: Отладка/выпуск
Чтобы быть более конкретным, у меня есть ссылка на ссылки на мои веб-службы, хранящиеся в настройках моего приложения. В режиме выпуска я хотел бы, чтобы эти настройки указывали на http://myWebservice.MyURL.com в режиме отладки. Мне бы хотелось, чтобы эти настройки были http://myDebuggableWebService.MyURL.com.
Любые идеи?
Ответы
Ответ 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();
}
}
}
Ответ 5
SlowCheetah добавляет функции, которые вы запрашиваете не только для App.config, но и для любого XML файла в вашем проекте - http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5
Ответ 6
У меня возникла аналогичная проблема для решения проблемы и в результате я использовал механизм преобразования XDT (web.config), который уже был предложен в ответе от ne1410s, который можно найти здесь: fooobar.com/info/253722/...
Но вместо того, чтобы делать это вручную, как описано в его ссылке, я использовал этот плагин: https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859
Плагин только помогает настроить конфигурацию, ее не нужно строить, и решение может быть создано на других машинах или на сервере сборки без плагина или любых других необходимых инструментов.