it-swarm.com.ru

Чтение настроек из 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 #.

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

723
Russ Clark

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

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

738
womp

Для примера 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"];

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

789
Ram

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

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

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

string keyvalue= Properties.Settings.Default.keyname;

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

71
bsivel

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

36
Shiva

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

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

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

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

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

    строковое значение = Properties.Settings.Default.keyname;

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

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();
22
Masoud Siahkali

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

21
Otávio Décio

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

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

  • SomeDll
  • SomeExe

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

17
Victor Naranjo

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

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

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

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

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

System.Configuration.ConfigurationSettings.AppSettings["MySetting"]
8
Tom

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

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

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

System.Configuration.ConfigurationSettings.AppSettings["Key"]
7
Wavare Santosh

Также вы можете использовать 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>();
4
pomber

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

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

4
Custodio

Как я нашел лучший подход для систематического доступа к переменным настроек приложения, создав класс-оболочку над 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
    }
4
Ashwini Jindal

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

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

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

3
rdans

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

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

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

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

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

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

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

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

2
Tony O'Hagan

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

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

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

1
nayanajith

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

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

вы можете использовать ниже линии, в моем случае это работало:

System.Configuration.ConfigurationSettings.AppSettings["yourKeyName"]

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

0
Mohammad D