Чтение настроек из app.config или web.config в .NET

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

Я нашел это

ConfigurationSettings.AppSettings.Get("MySetting")

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

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

ConfigurationManager.AppSettings["MySetting"]

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

Каков наилучший способ сделать это?

27.07.2009 16:58:44
Как я прочитал 4 MSDN примеры и статьи ... И приземлился здесь. Просто добавьте ссылку ... почему они не могут просто сказать это. Хороший вопрос! +1
Piotr Kula 14.09.2012 10:18:56
Если вы хотите , чтобы записать настройки обратно , а также, смотрите здесь , как вы можете это сделать.
Matt 17.07.2017 11:16:40
Matt 17.07.2017 11:17:36
25 ОТВЕТОВ
РЕШЕНИЕ

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

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

794
2.06.2015 18:25:08
Большое спасибо! очень прямой ответ. Я строил консольное приложение! и этот ответ сохранить день!
PatsonLeaner 29.05.2019 06:36:05
Точно ли это для ядра .net?
Triynko 5.03.2020 19:52:57

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

21
27.12.2019 15:26:30

Щелкните правой кнопкой мыши на вашей библиотеке классов и выберите в меню пункт «Добавить ссылки».

И на вкладке .NET выберите System.Configuration. Это будет включать файл DLL System.Configuration в ваш проект.

37
27.12.2019 15:27:57
После добавления ссылки, смог сделатьConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy 20.12.2017 20:41:10

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

textBox1.Text = ConfigurationManager.AppSettings["Name"];
28
24.10.2019 12:25:53
TS прямо заявляет, что он использует тот же код, но его проект не компилируется (как оказалось, из-за отсутствующих ссылок). -1 за то, что не читал вопрос.
Isantipov 12.03.2013 17:28:57

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

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

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

7
27.12.2019 15:30:53
Также возможно использовать System.Configuration.COnfigurationSettings.AppSettings.Get("Key")вместо использования квадратных скобок.
Mason 19.12.2017 09:24:02

Для примера файла 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"];
862
27.12.2019 15:33:02
Мне нравится ваш ответ больше, чем принятый ответ. Ответы с примерами всегда помогают мне.
Brendan Vogt 4.02.2014 07:36:27
Это сработало для меня. Однако моя System.Configuration не содержит ConfigurationManager, поэтому мне пришлось использовать ConfigurationSettings. По иронии судьбы я все же получил предупреждение, что оно устарело.
Nightmare Games 6.01.2015 21:42:12
Это случилось со мной тоже. Вы пытались добавить ссылку System.Configuration? Проблема в том, что VS обманывает вас, заставляя думать, что у вас это есть; Вы можете использовать intellisense для получения пространства имен System.Configuration, но у него нет класса ConfigurationManager. Просто добавьте ссылку и это исправит.
Francine DeGrood Taylor 15.01.2015 21:53:35
@Cricketheads System.Configuration содержит ConfigurationManager, в вашем проекте, скорее всего, отсутствует ссылка на System.Configuration.
TreK 6.03.2015 22:36:17
Может кто-нибудь сказать мне, почему они думают, что System.Configuration не добавлена ​​по умолчанию ... это кажется довольно простой потребностью в большинстве приложений.
Todd Vance 26.04.2017 17:53:13

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

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

4
27.12.2019 15:34:58
Microsoft уже имеет Bulit-в способе управления нескольких версий одного и тот же файл конфигурации: конфигурации сборки , которые позволяют иметь отдельные конфигурационные файлы для каждой конфигурации сборки: app.DEBUG.config, app.RELEASE.configи app.TEST.configт.д.
jpaugh 13.06.2017 16:43:24

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

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>
1
27.12.2019 15:36:11

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

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

  • SomeDll
  • SomeExe

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

17
27.12.2019 15:38:58
Вау, это не очевидно. Если бы кто-то мог связать документ, говорящий об этом, это было бы здорово. Это сложная тема для поиска.
David Krider 10.01.2015 19:12:22
Спасибо за это. Не видел нигде заявленного.
parameter 28.08.2018 14:16:38

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

8
27.12.2019 15:39:31
Согласно Microsoft относительно ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M 20.02.2014 13:44:14
этот метод
GabrielBB 20.08.2014 16:50:47

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

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

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

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
10
27.12.2019 15:40:53

Также вы можете использовать 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>();
4
27.12.2019 15:42:39
С какой стати вы хотите это сделать?
lukejkw 26.09.2016 15:10:44

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

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

Теперь перейдите к классу Setting через Свойства:

string keyvalue = Properties.Settings.Default.keyname;

См. Управление настройками приложения для получения дополнительной информации.

90
27.12.2019 16:05:50
Недвижимость с 2010 года .
Nick Westgate 19.02.2016 03:32:22
Большое спасибо за размещение этого. Я определил, что Properties.Settings.Default.MachName работает, но я не мог понять, почему ConfigurationManager.AppSettings ["MachName"] возвратил ноль.
J. Chris Compton 20.05.2016 21:36:20
Это закончило мою длительную агонию. Спасибо. Структура должна предупредить вас, что старый способ устарел.
Neil B 28.11.2017 11:55:08
Не могу подтвердить. ConfigurationManager.AppSettings ["someKey"] работает в .NET 4.5, 4.6, 4.7.1
Ivanhoe 5.06.2018 12:48:01
@Ivanhoe Какую версию VisualStudio вы использовали? ConfigurationManager.AppSettings ["someKey"] работал с 4.6.1 и VS 15.8.2, но не работал с 4.6.1 и VS 15.9.2 для меня.
kkuilla 23.11.2018 13:34:09

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

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

2
27.12.2019 15:45:36

Просто для полноты, есть еще один вариант, доступный только для веб-проектов: System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

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

3
27.12.2019 15:46:13

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

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
1
30.03.2016 15:15:19

Читать из конфигурации:

Вам нужно будет добавить ссылку на конфигурацию:

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

    string value = Properties.Settings.Default.keyname;

Сохранить в конфигурации:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();
23
27.12.2019 15:49:24
К вашему сведению: Google больше всего нравится ваш ответ. Появляется дословно при поиске «получить настройки конфигурации приложения c #»
Steve Gomez 16.12.2016 19:46:16

Как я обнаружил, лучший подход для систематического доступа к переменным настроек приложения - создать класс-оболочку над 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
}
6
27.12.2019 15:51:06
При этом используется метод, который указывает OP, помечается как устаревший.
user2864740 8.02.2017 18:09:17

Вот пример: 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
-7
27.12.2019 15:52:46

Пожалуйста, проверьте версию .NET, над которой вы работаете. Оно должно быть больше 4. И вам нужно добавить системную библиотеку System.Configuration в ваше приложение.

0
27.12.2019 16:00:25
Этот вопрос был задан более 9 лет назад, и уже имеет более 20 ответов, в том числе 2, каждый из которых имеет более 600 голосов, и принято добавить ссылку на System.Configuration. Этот дополнительный ответ не добавляет ценности. В лучшем случае это должен быть комментарий к принятому ответу.
Richardissimo 23.09.2018 06:17:06
Re "выше, чем 4" : в основной номер версии? Или ты имеешь в виду "выше 4,0" ? Или, другими словами, на какой стороне будет .NET Framework 4.5 ?
Peter Mortensen 27.12.2019 16:03:42

Шаг 1: Щелкните правой кнопкой мыши на вкладке ссылок, чтобы добавить ссылку.

Шаг 2: Нажмите на вкладку Сборки

Шаг 3: Поиск «System.Configuration»

Шаг 4: Нажмите ОК.

Тогда это будет работать.

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];
3
27.12.2019 16:06:14

Вы можете использовать следующую строку. В моем случае это работало: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

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

1
27.12.2019 16:07:46

ConfigurationManager - это не то, что вам нужно для доступа к вашим собственным настройкам.

Для этого вы должны использовать

{YourAppName}.Properties.Settings.{settingName}

1
27.12.2019 16:08:45

Мне удалось получить следующий подход, работающий для проектов .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
27.12.2019 16:17:51

Если вы нуждаетесь / хотите использовать ConfigurationManagerкласс ...

Вам может потребоваться загрузка System.Configuration.ConfigurationManagerчерез Microsoft через диспетчер пакетов NuGet

Инструменты-> Диспетчер пакетов NuGet-> Управление пакетами NuGet для решения ...

Документы Microsoft

Из документов следует отметить одну вещь ...

Если вашему приложению необходим доступ только для чтения к его собственной конфигурации, мы рекомендуем использовать метод GetSection (String). Этот метод обеспечивает доступ к кэшированным значениям конфигурации для текущего приложения, которое имеет лучшую производительность, чем класс Configuration.

0
6.03.2020 00:29:25