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

506

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

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

ConfigurationSettings.AppSettings.Get("MySetting")

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

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

ConfigurationManager.AppSettings["MySetting"]

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

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

  • 37
    Как я прочитал 4 MSDN примеров и статей .. И приземлился здесь. Просто добавьте ссылку ... почему они не могут просто сказать это. Хороший вопрос! +1
  • 1
    Если вы хотите , чтобы записать настройки обратно , а также, смотрите здесь , как вы можете это сделать.
Показать ещё 1 комментарий
Теги:

19 ответов

615
Лучший ответ

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

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

550

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

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

  • 104
    Мне нравится ваш ответ больше, чем принятый ответ. Ответы с примерами всегда помогают мне.
  • 4
    Почему против? Это не отвечает на вопрос вообще.
Показать ещё 10 комментариев
40

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

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

Теперь перейдите в класс настроек через Properties:

string keyvalue= Properties.Settings.Default.keyname;

Подробнее см. "Управление настройками приложения" .

  • 1
    Недвижимость с 2010 года .
  • 0
    Большое спасибо за размещение этого. Я определил, что Properties.Settings.Default.MachName работает, но я не мог понять, почему ConfigurationManager.AppSettings ["MachName"] возвратил ноль.
Показать ещё 3 комментария
32

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

  • 0
    После добавления ссылки, смог сделать ConfigurationManager.ConnectionStrings[0].ConnectionString
24

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

textBox1.Text = ConfigurationManager.AppSettings["Name"];
  • 44
    TS явно заявляет, что он использует тот же код, но его проект не компилируется (как оказалось, из-за отсутствующих ссылок). -1 за то, что не читал вопрос.
18

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

12

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

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

  • SomeDll
  • SomeExe

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

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

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

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

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

    string value = Properties.Settings.Default.keyname;

Сохранить в настройках:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();
  • 1
    К вашему сведению: Google больше всего любит ваш ответ. Появляется дословно при поиске «получить настройки конфигурации приложения c #»
5

Попробуйте следующее:

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

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

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
  • 3
    на этот вопрос уже есть хорошо принятые ответы .. что ты хочешь сказать ???
4

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

System.Configuration.ConfigurationSettings.AppSettings["MySetting"]
  • 4
    Согласно Microsoft относительно ConfigurationSettings.AppSettings This method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
  • 2
    этот метод устарел
2

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

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

  • 0
    У Microsoft уже есть встроенный способ управления несколькими версиями одного и того же файла конфигурации: конфигурации сборки , которые позволяют иметь отдельные файлы конфигурации для каждой конфигурации сборки: app.DEBUG.config , app.RELEASE.config и app.TEST.config , так далее.
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, помечается как устаревший.
1

Кроме того, вы можете использовать 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
    С какой стати вы хотите это сделать?
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") вместо использования квадратных скобок.
0

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

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

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

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

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

0

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

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

0

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

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

для ex:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню