2009-07-27 3 views
569

Я работаю над библиотекой классов C#, которая должна быть в состоянии читать настройки из файла web.config или app.config (в зависимости от того, ссылается ли DLL на ASP .NET веб-приложение или приложение Windows Forms).Чтение настроек из app.config или web.config в .net

Я обнаружил, что

ConfigurationSettings.AppSettings.Get("MySetting") 

работает, но этот код был отмечен как устаревшим Microsoft.

Я читал, что я должен использовать:

ConfigurationManager.AppSettings["MySetting"] 

Однако System.Configuration.ConfigurationManager класс, кажется, не будут доступны из проекта C# Class Library.

Кто-нибудь знает, что лучший способ сделать это?

+22

Как я прочитал 4 примера MSDN и статьи .. И приземлился здесь. Просто добавьте ссылку .. почему они не могут просто сказать это. Хороший вопрос! +1 – ppumkin

+0

Если вы хотите ** записать настройки назад **, посмотрите ** [здесь] (https://stackoverflow.com/a/11841175/1016343) **, как вы можете это сделать. – Matt

+0

Возможный дубликат [Плюсы и минусы AppSettings vs applicationSettings (.NET app.config/Web.config)] (https://stackoverflow.com/questions/460935/pros-and-cons-of-appsettings-vs-applicationsettings -net-app-config-web-confi) – Matt

ответ

613

Вам нужно добавить ссылку наSystem.Configuration в ссылки вашего проекта папку.

Вы должны обязательно использовать ConfigurationManager по устаревшим ConfigurationSettings.

18

Вы должны добавить в проект ссылку на сборку System.Configuration.

34

Щелкните правой кнопкой мыши на библиотеке классов и выберите «Добавить ссылки» в меню; и, наконец, с вкладки .NET выберите System.Configuration. Это будет включать DLL System.Configuration в ваш проект.

+0

После добавления ссылки удалось выполнить 'ConfigurationManager.ConnectionStrings [0] .ConnectionString' – SushiGuy

27

Im используя это, и это хорошо работает для меня

textBox1.Text = ConfigurationManager.AppSettings["Name"]; 
+39

TS явно заявляет, что использует тот же код, но его проект не скомпилирован (из-за недостающих ссылок, как оказалось). -1 для того, чтобы не читать вопрос. – Isantipov

1

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

app.config Используется для приложений Windows. Когда вы создаете приложение в vs.net, оно будет автоматически переименовано в <appname>.exe.config, и этот файл должен быть доставлен вместе с вашим приложением.

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

System.Configuration.COnfigurationSettings.AppSettings["Key"] 
+0

Также можно использовать '' 'System.Configuration.COnfigurationSettings.AppSettings.Get (« Key »)' '' вместо использования квадратных скобок. – Mason

625

Для образца App.config, как показано ниже:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="countoffiles" value="7" /> 
    <add key="logfilelocation" value="abc.txt" /> 
    </appSettings> 
</configuration> 

Читает вышеуказанные настройки приложения с помощью кода ниже:

using System.Configuration; 

Возможно, вам также необходимо будет добавить ссылку на System.Configuration в вашем проекте, если его еще нет. Затем вы можете получить доступ к таким значениям:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"]; 
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"]; 

Надеюсь, это поможет!

+83

Мне больше нравится ваш ответ, чем принятый ответ. Ответы с примерами всегда делают трюк для меня. –

+2

Почему упреки? Это вообще не отвечает на вопрос. – Gigo

+14

@Gigo показывает * как * использовать Configuration Manager, включая приложение.config, а также пример кода. В принятом ответе нет. – crashmstr

2

Настоятельно рекомендую вам создать Wrapper для этого вызова. Что-то вроде ConfigurationReaderService и используйте инъекцию зависимости, чтобы получить этот класс. Таким образом вы сможете изолировать эти файлы конфигурации для целей тестирования.

Итак, используйте предложенную ConfigurationManager.AppSettings["something"]; и верните это значение. Вы можете с помощью этого метода создать какой-то возврат по умолчанию, если в файле .config отсутствует ключ.

+0

У Microsoft уже есть возможность запуска нескольких версий одного и того же конфигурационного файла: [строить конфигурации] (https://msdn.microsoft.com/en-us/library/kkz9kefa.aspx), которые позволяют иметь отдельную конфигурацию файлы для каждой конфигурации сборки: 'app.DEBUG.config',' app.RELEASE.config' и 'app.TEST.config' и т. д. – jpaugh

0

Я пытался найти исправление для этой же проблемы в течение пары дней. Я смог разрешить это, добавив ключ в тег appsettings в файле web.config. Это должно переопределить .dll при использовании помощника.

<configuration> 
<appSettings> 
<add key="loginUrl" value="~/RedirectValue.cshtml" /> 
<add key="autoFormsAuthentication" value="false"/> 
</appSettings> 
</configuration> 
12

Возможно, вы добавили файл App.config в DLL. App.Config работает только для исполняемых проектов, так как все DLL принимают конфигурацию из файла конфигурации для исполняемого exe.

Допустим, у вас есть два проекта в вашем решении:

  • SomeDll
  • SomeExe

Ваша проблема может быть в Сопутствующие того, что вы в том числе в app.config для SomeDLL а не SomeExe. SomeDll может прочитать конфигурацию из проекта SomeExe.

+0

Вау, это не очевидно. Если бы кто-то мог связать документ, говорящий об этом, это было бы фантастически. Это сложная тема для поиска. –

5

У меня была такая же проблема, только что прочитал их таким образом:

System.Configuration.ConfigurationSettings.AppSettings["MySetting"] 
+4

В соответствии с Microsoft относительно ConfigurationSettings.AppSettings «Этот метод устарел, он был заменен на System.Configuration! System.Configuration.ConfigurationManager.AppSettings' –

+2

этот метод устарел – GabrielBB

5

Попробуйте это:

string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"]; 

В web.config должна быть следующая структура:

<configuration> 
<appSettings> 
<add key="keyname" value="keyvalue" /> 
</appSettings> 
</configuration> 
+2

этот вопрос уже имеет хорошо принятые ответы .. что хотите? сказать??? – tod

1

Также , вы можете использовать formo:

Config:

<appSettings> 
    <add key="RetryAttempts" value="5" /> 
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" /> 
</appSettings> 

Код:

dynamic config = new Configuration(); 
var retryAttempts1 = config.RetryAttempts;     // returns 5 as a string 
var retryAttempts2 = config.RetryAttempts(10);    // returns 5 if found in config, else 10 
var retryAttempts3 = config.RetryAttempts(userInput, 10); // returns 5 if it exists in config, else userInput if not null, else 10 
var appBuildDate = config.ApplicationBuildDate<DateTime>(); 
+5

Почему бы вам это сделать? – lukejkw

46

Обновление для рамок 4.5 и 4.6; больше не будет следующая работа:

string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"]; 

Теперь доступ к классу Настройка с помощью свойства:

string keyvalue= Properties.Settings.Default.keyname; 

См Managing Application Settings для получения дополнительной информации.

+1

Свойства с [2010] (https://msdn.microsoft.com/library/a65txexh (v = vs.100) .aspx]). –

+0

Большое спасибо за публикацию этого. Я определил, что Properties.Settings.Default.MachName работал, но я не мог понять, почему ConfigurationManager.AppSettings ["MachName"] возвращает null. –

+0

Спасибо @bsivel d – Nezir

0

Я всегда создаю интерфейс IConfig с типичными свойствами, объявленными для всех значений конфигурации. Затем класс реализации Config завершает вызовы System.Configuration. Все ваши вызовы System.Configuration теперь в одном месте намного проще и чище, чтобы поддерживать и отслеживать, какие поля используются, и объявлять их значения по умолчанию. Я пишу набор частных вспомогательных методов для чтения и анализа общих типов данных.

Используя среду IoC, вы можете получить доступ к полям IConfig в любом месте вашего приложения, просто передав интерфейс конструктору класса. Затем вы можете создавать макетные реализации интерфейса IConfig в своих модульных тестах, чтобы теперь вы могли тестировать различные значения конфигурации и комбинации значений без необходимости касаться вашего файла App.config или Web.config.

0

Просто для полноты картины, есть еще доступна только для веб-проектов вариант:

System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"] 

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

0

Другое возможное решение:

var MyReader = new System.Configuration.AppSettingsReader(); 
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString(); 
6

Чтение От Config:

Вам нужно добавить ссылку Config

  1. Открыть "Свойства" на вашем проекте
  2. Go на вкладку «Настройки»
  3. Добавить «Имя» и «Ценность»
  4. Получить значение с помощью следующего кода:

    string value = Properties.Settings.Default.keyname;

Сохранить Config:

Properties.Settings.Default.keyName = value; 
    Properties.Settings.Default.Save(); 
+0

FYI: Google лучше всего подходит к вашему ответу. Показывает стенографию при поиске «получить настройки конфигурации приложения C#». –

1

Как я нашел наилучший подход для доступа к настройкам приложения переменных в систематическим образом, сделав класс-обертку над System.Configuration, как показано ниже

public class BaseConfiguration 
    { 
     protected static object GetAppSetting(Type expectedType, string key) 
     { 
      string value = ConfigurationManager.AppSettings.Get(key); 
      try 
      { 
       if (expectedType == typeof(int)) 
        return int.Parse(value); 
       if (expectedType == typeof(string)) 
        return value; 

       throw new Exception("Type not supported."); 
      } 
      catch (Exception ex) 
      { 
       throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.", 
        key, expectedType), ex); 
      } 
     } 
    } 

сейчас мы можем получить доступ к необходимым параметрам настроек с помощью жестко закодированных имен, используя другой класс, как указано ниже:

public class ConfigurationSettings:BaseConfiguration 
    { 
     #region App setting 

     public static string ApplicationName 
     { 
      get { return (string)GetAppSetting(typeof(string), "ApplicationName"); } 
     } 

     public static string MailBccAddress 
     { 
      get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); } 
     } 

     public static string DefaultConnection 
     { 
      get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); } 
     } 

     #endregion App setting 

     #region global setting 



     #endregion global setting 
    } 
+0

Это использует метод, который указывает OP, отмечен как устаревший. – user2864740

-3

напр:

<applicationSettings> 
     <MyApp.My.MySettings> 
      <setting name="Printer" serializeAs="String"> 
       <value>1234 </value> 
      </setting> 
     </MyApp.My.MySettings> 
    </applicationSettings> 
Dim strPrinterName as string= My.settings.Printer