Читання налаштувань з app.config або web.config в .NET


806

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

Я це знайшов

ConfigurationSettings.AppSettings.Get("MySetting")

працює, але цей код позначений Microsoft як устарений.

Я читав, що я повинен використовувати:

ConfigurationManager.AppSettings["MySetting"]

Однак System.Configuration.ConfigurationManager клас, здається, не доступний у проекті бібліотеки класів C #.

Який найкращий спосіб зробити це?


48
Як я читав 4 приклади та статті MSDN .. І приземлився тут. Просто додайте посилання .. чому вони не можуть просто так сказати. Хороше питання! +1
Пьотр Кула

1
Якщо ви також хочете записати налаштування назад , подивіться тут, як це можна зробити.
Метт

Відповіді:


797

Вам потрібно додати посилання на System.Configurationв вашому проекті папки посилання .

Ви, безумовно, повинні користуватися ConfigurationManagerнад застарілим ConfigurationSettings.


Дуже дякую! дуже пряма відповідь вперед. Я будував консольний додаток! і ця відповідь врятує день!
PatsonLeaner

1
Це все ще точно для .net core.
Трайнко

867

Для зразкового файлу 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"];

124
Мені подобається ваша відповідь більше, ніж прийнята відповідь. Відповіді з прикладами завжди роблять для мене хитрість.
Брендан Фогт

Це працювало для мене. Однак моя System.Configuration не містить ConfigurationManager, тому мені довелося використовувати ConfigurationSettings. За іронією долі, я все ж отримав попередження, що це застаріло.
Кошмарні ігри

13
Це сталося і зі мною. Ви намагалися додати посилання на System.Configuration? Проблема полягає в тому, що VS обманює вас, змушуючи вас думати, що ви насправді є; ви можете використовувати intellisense для отримання простору імен System.Configuration, але він не має класу ConfigurationManager. Просто додайте посилання і це виправить.
Francine DeGrood Taylor

3
@Cricketheads System.Configuration не містить ConfigurationManager, ви, ймовірно, відсутня посилання на System.Configuration у вашому проекті.
TreK

2
Може хтось скаже мені, чому вони думають, що System.Configuration не додано за замовчуванням ... це здається досить основною потребою у більшості програм.
Тодд Ванс

89

Оновлення для .NET Framework 4.5 і 4.6; наступне більше не працюватиме:

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

Тепер перейдіть до класу Setting через Properties:

string keyvalue = Properties.Settings.Default.keyname;

Додаткову інформацію див. У розділі Керування налаштуваннями додатків .


1
Властивості з 2010 року .
Нік Вестгейт

1
Дякую за публікацію. Я визначив, що Properties.Settings.Default.MachName працював, але не міг зрозуміти, чому ConfigurationManager.AppSettings ["MachName"] повернув нуль.
Дж. Кріс Комптон

1
На цьому закінчилася моя тривала агонія. Дякую. Рамка повинна попереджати вас про те, що старий спосіб застарілий.
Ніл Б

7
Неможливо підтвердити. ConfigurationManager.AppSettings ["someKey"] працює у .NET 4.5, 4.6, 4.7.1
Ivanhoe

1
@Ivanhoe Яку версію VisualStudio ви використовували? ConfigurationManager.AppSettings ["someKey"] працював з 4.6.1 та VS 15.8.2, але не вдався з 4.6.1 та VS 15.9.2 для мене.
kkuilla

37

Клацніть правою кнопкою миші на вашій бібліотеці класів та виберіть у меню опцію "Додати посилання".

І на вкладці .NET виберіть System.Configuration. Це включає файл DLL System.Configuration у ваш проект.


Після додавання посилання вдалося зробитиConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy

29

Я використовую це, і це добре працює для мене:

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

48
ТС прямо зазначає, що він використовує той самий код, але його проект не вдається скласти (через відсутні посилання, як виявилося). -1 за те, що не читав питання.
Ісантіпов

23

Читати з налаштування:

Вам потрібно буде додати посилання на конфігурацію:

  1. Відкрийте "Властивості" у своєму проекті
  2. Перейдіть на вкладку "Налаштування"
  3. Додайте "Ім'я" та "Значення"
  4. Отримайте значення за допомогою наступного коду:

    string value = Properties.Settings.Default.keyname;

Збережіть у конфігурації:

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

1
FYI: Google найкраще подобається вашій відповіді. Відображається дослівно під час пошуку "отримати налаштування конфігурації додатків c #"
Стів Гомес

21

Ви повинні додати посилання на збірку System.Configuration до проекту.


18

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

Скажімо, у вашому рішенні є два проекти:

  • SomeDll
  • ДеякіExe

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


Ого, це не очевидно. Якби хтось міг зв’язати документ, який говорив про це, це було б фантастично. Це важка тема для пошуку.
Девід Крідер

Дякую за це Ніде цього не було зазначено.
параметр

10

Спробуйте це:

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

У файлі web.config це має бути наступна структура:

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

8

У мене була така ж проблема. Просто прочитайте їх таким чином: System.Configuration.ConfigurationSettings.AppSettings ["MySetting"]


4
Відповідно до Microsoft, що стосується ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Пітер М

2
цей метод застарілий
ГабріельББ

7

web.configвикористовується з веб-додатками. web.configза замовчуванням має кілька конфігурацій, необхідних для веб-програми. Ви можете матиweb.config для кожної папки у своєму веб-додатку.

app.configвикористовується для програм Windows. Коли ви збираєте додаток у Visual Studio, він буде автоматично перейменований у<appname>.exe.config цей файл, і цей файл повинен бути доставлений разом із вашою заявою.

Ви можете використовувати один і той же метод для виклику app settingsзначень з обох файлів конфігурації: System.Configuration.ConfigurationSettings.AppSettings ["Key"]


Також можна використовувати System.Configuration.COnfigurationSettings.AppSettings.Get("Key")замість квадратних дужок.
Мейсон

7

Оскільки я знайшов найкращий підхід до доступу до змінних параметрів програми на систематичному шляху, зробивши клас обгортки через 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
}

При цьому використовується метод, за який вказуються точки ОП, як застарілий.
користувач2864740

4

Настійно рекомендую створити обгортку для цього дзвінка. Щось на кшталт a ConfigurationReaderServiceі використовуйте ін'єкцію залежності щоб отримати цей клас. Таким чином ви зможете ізолювати ці файли конфігурації для тестових цілей.

Тому використовуйте ConfigurationManager.AppSettings["something"];запропоновані та поверніть це значення. За допомогою цього методу ви можете створити якесь повернення за замовчуванням, якщо у файлі .config немає жодного ключа.


3
Microsoft вже має Bulit-в способі управління декількох версій одного і той же файл конфігурації: конфігурації збірки , які дозволяють мати окремі конфігураційні файли для кожної конфігурації збірки: app.DEBUG.config, app.RELEASE.configі app.TEST.configт.д.
jpaugh

4

Також ви можете використовувати Formo :

Конфігурація:

<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

3

Для повноти є ще одна можливість, доступна лише для веб-проектів: System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

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


3

Крок 1: Клацніть правою кнопкою миші на вкладці посилання, щоб додати посилання.

Крок 2: Перейдіть на вкладку Асемблери

Крок 3: Знайдіть "System.Configuration"

Крок 4: натисніть кнопку ОК.

Тоді це спрацює.

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

2

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

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


1

Ще одне можливе рішення:

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

1

Я вже пару днів намагаюся знайти виправлення цього ж питання. Мені вдалося вирішити це, додавши ключ у тег програм у файлі web.config . Це має замінити файл .dll при використанні помічника.

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

1

Ви можете використовувати рядок нижче. У моєму випадку це працювало: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

Ви повинні подбати про те, щоб вищезазначений рядок коду був також старою версією і він застарів у нових бібліотеках.


1

ConfigurationManager - це не те, що вам потрібно для доступу до власних налаштувань.

Для цього вам слід скористатися

{YourAppName}.Properties.Settings.{settingName}


1

Мені вдалося отримати наступний підхід, який працює для .NET Core проектів:

Кроки:

  1. Створіть у своєму проекті appsettings.json (формат, наведений нижче).
  2. Далі створіть клас конфігурації. Формат надано нижче.
  3. Я створив метод Login () для показу класу конфігурації.

    Створіть у своєму проекті appsettings.json із вмістом:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    
    public static class Configuration
    {
        private static IConfiguration _configuration;
    
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
    
            _configuration = builder.Build();
    
        }
        public static Browser GetBrowser()
        {
    
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
    
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
    
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    
    }
    
    
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }

1

Якщо ви потребуєте / хочете скористатися ConfigurationManager клас ...

Вам може знадобитися завантаження System.Configuration.ConfigurationManagerMicrosoft через NuGet Package Manager

Інструменти-> Менеджер пакунків NuGet-> Керування пакетами NuGet для вирішення ...

Документи Microsoft

Одне, що варто відзначити в документах ...

Якщо вашій програмі потрібен доступ лише для читання до власної конфігурації, радимо скористатися методом GetSection (String). Цей метод забезпечує доступ до кешованих значень конфігурації для поточної програми, яка має кращу продуктивність, ніж клас Конфігурація.


0

Перевірте версію .NET, над якою ви працюєте. Він повинен бути вище 4. І вам потрібно додати до своєї програми системну бібліотеку System.Configuration.


3
Це запитання було задано 9 років тому, і вже налічується понад 20 відповідей, у тому числі 2, в кожній з яких понад 600 посилань, прийнята відповідь полягає в тому, щоб додати посилання на System.Configuration. Ця додаткова відповідь не додає значення. У кращому випадку це має бути коментар до прийнятої відповіді.
Річардсіссімо

Re "вище 4" : У основній кількості версії? Або ви маєте на увазі "вище 4,0" ? Або іншими словами, на якій стороні буде .NET Framework 4.5 ?
Пітер Мортенсен

-8

Ось приклад: App.config

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>

Dim strPrinterName as string = My.settings.Printer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.