AppSettings получают значение из файла .config

172

Я не могу получить доступ к значениям в файле конфигурации.

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var clientsFilePath = config.AppSettings.Settings["ClientsFilePath"].Value; 
// the second line gets a NullReferenceException

Файл .config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- ... -->
    <add key="ClientsFilePath" value="filepath"/>
    <!-- ... -->
  </appSettings>
</configuration>

Есть ли у вас какие-либо предложения, что мне делать?

Matt
источник

Ответы:

345

Это работает для меня:

string value = System.Configuration.ConfigurationManager.AppSettings[key];
Адам
источник
6
Приведенный мною код требует, чтобы файл YourProgram.exe.config находился в той же папке, что и YourProgram.exe. Просто убедитесь, что это там. Распространенной ошибкой является копирование файла app.config в каталог назначения, который не будет работать.
Адам
40
Требуется добавить ссылку System.Configuration.
контрольная сумма
13
Мой .NET 4.5 System.Configuration не имеетConfigurationManager
qwert_ukg
3
Я также получаю ноль в проекте 4.5 - потратил два часа на это .. Должно быть ошибка.
IrishChieftain
1
Я также вижу это в многоцелевом приложении, моя конфигурация ядра .net работает, но конфигурация платформы .net не работает (с помощью ConfigurationManager)
Майкл Браун
61

Ответ, который дал дцг работает:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];

НО, вам нужно добавить ссылку на сборку

Конфигурация системы

Перейдите в окне Solution Explorer и щелкните правой кнопкой мыши на References и выберите Добавить ссылку . Выберите вкладку « Сборки » и найдите « Конфигурация» .

Справочный менеджер

Вот пример моего App.config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
    <add key="AdminName" value="My Name"/>
    <add key="AdminEMail" value="MyEMailAddress"/>
  </appSettings>
</configuration>

Который вы можете получить следующим образом:

string adminName = ConfigurationManager.AppSettings["AdminName"];
rotgers
источник
2
Кажется, у меня та же проблема, что и у OP. Использование VS2015. Я не знаю как или почему, но моя ссылка на System.Configuration говорит System.configuration (строчные буквы).
Тим
Это может быть сделано с объяснением, чтобы покрыть там, где нет вкладки «сборки» (по крайней мере VS2019)
SomeoneElse
21

Дайте этому попробовать:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
dtsg
источник
4
Ваша реализация этого должна быть неправильной. Это определенно работает для получения значений ключей из файла конфигурации.
дцг
Убедитесь, что вы добавили ссылку на System.Configuration в ссылках для вашего проекта!
GrahamJ
19

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

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

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

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

Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();
Масуд Сиахкали
источник
4
Действительно полезно, так как все другие ответы, использующие ConfigurationManager, не работают, если вы добавляете свои значения на вкладках «Настройки» свойств проекта, как вы описали. Спасибо.
Тупая редька
2
Это сработало и для меня. Я получал nullстроку с вышеуказанными рекомендациями, но Properties.Settings.Default.<keyName>работал как шарм!
даб стайл
1
Отлично ! Я искал это :) Спасибо!
HSQL
@Masoud Siahkali, на прошлой неделе я в значительной степени попробовал то, что у вас здесь, в моем собственном проекте, но значения, когда пользователь изменял их во время выполнения (пока просто запускаю его из графического интерфейса VS), не сохраняются между экземплярами. Мой вопрос: stackoverflow.com/questions/61018443/… .
До
8

Я использую:

    ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
    //configMap.ExeConfigFilename = @"d:\test\justAConfigFile.config.whateverYouLikeExtension";
    configMap.ExeConfigFilename = AppDomain.CurrentDomain.BaseDirectory + ServiceConstants.FILE_SETTING;
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
    value1 = System.Configuration.ConfigurationManager.AppSettings["NewKey0"];
    value2 = config.AppSettings.Settings["NewKey0"].Value;
    value3 = ConfigurationManager.AppSettings["NewKey0"];

Где value1 = ... и value3 = ... дает ноль, а value2 = ... работает

Затем я решил заменить внутренний app.config на:

// Note works in service but not in wpf
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"d:\test\justAConfigFile.config.whateverYouLikeExtension");
ConfigurationManager.RefreshSection("appSettings");

string value = ConfigurationManager.AppSettings["NewKey0"];

Использование VS2012 .net 4

Kkloe
источник
Это именно то, что мне было нужно. Действительно полезно, спасибо.
Умут ОВЕКОГЛУ
5

В app/web.configфайле задайте следующую конфигурацию:

<configuration>
  <appSettings>
    <add key="NameForTheKey" value="ValueForThisKey" />
    ... 
    ...    
  </appSettings>
...
...
</configuration>

тогда вы можете получить доступ к этому в своем коде, вставив в эту строку:

string myVar = System.Configuration.ConfigurationManager.AppSettings["NameForTheKey"];

* Обратите внимание, что это отлично работает для .net4.5.xи .net4.6.x; но не работают на .net core. С наилучшими пожеланиями: Рафаэль

Рафаэль Андрс Чспедес Бастерио
источник
3

Возвращаясь к этому после долгого времени ...

Учитывая упадок ConfigurationManager, для тех, кто все еще ищет ответ на эту попытку (например):

AppSettingsReader appsettingsreader = new AppSettingsReader();
string timeAsString = (string)(new AppSettingsReader().GetValue("Service.Instance.Trigger.Time", typeof(string)));

Требуется System.Configuration конечно.

(Отредактировал код так, чтобы он действительно работал и его было проще читать)

Майк Дин
источник
Хороший ответ, но, пожалуйста, уточните, зачем создавать новый экземпляр AppSettingsReader, когда вы заново создаете AppSettingsReader, и вам не нужно приводить строку, вы можете просто завершить ее переопределением .ToString ().
Maytham-ɯɐɥʇʎɐɯ
2

Видите, я сделал то, что мне показалось очевидным:

string filePath = ConfigurationManager.AppSettings.GetValues("ClientsFilePath").ToString();

Пока он компилируется, он всегда возвращает ноль.

Это однако (сверху) работает:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
Стив
источник
2

Некоторые из ответов, кажется, немного от ИМО Вот мой взгляд около 2016 года

<add key="ClientsFilePath" value="filepath"/>

Убедитесь, что System.Configurationссылка.

Вопрос задает вопрос о значении ключа appsettings

Что, безусловно, ДОЛЖНО быть

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

Вот поворот, в котором вы можете сгруппировать значения (не для этого вопроса)

var emails = ConfigurationManager.AppSettings[ConfigurationManager.AppSettings["Environment"] + "_Emails"];

emails будет значением ключа среды + "_Emails"

example :   jack@google.com;thad@google.com;
Том Стиккель
источник
2

Для веб-приложения я обычно пишу этот метод и просто вызываю его ключом.

private String GetConfigValue(String key)
    {
       return System.Web.Configuration.WebConfigurationManager.AppSettings[key].ToString();
    }
suulisin
источник
1

Вы можете просто напечатать:

string filePath = Sysem.Configuration.ConfigurationManager.AppSettings[key.ToString()];

потому что keyявляется объектом и AppSettingsпринимает строку

Сопрано
источник
1
ConfigurationManager.RefreshSection("appSettings")
string value = System.Configuration.ConfigurationManager.AppSettings[key];
musicinmusic
источник
1

Или вы можете использовать

string value = system.configuration.ConfigurationManager.AppSettings.Get("ClientsFilePath");

//Gets the values associated with the specified key from the System.Collections.Specialized.NameValueCollection
Давид Микучадзе
источник
0

Мой простой тест также не удался, следуя советам других ответов здесь - пока я не понял, что конфигурационный файл, который я добавил в мое настольное приложение, получил имя «App1.config». Я переименовал его в «App.config», и все сразу заработало как надо.

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

КОД БУДЕТ СОЗДАН АВТОМАТИЧЕСКИ

    <configuration>
      <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup ..." ... >
          <section name="XX....Properties.Settings" type="System.Configuration.ClientSettingsSection ..." ... />
        </sectionGroup>
      </configSections>
      <applicationSettings>
        <XX....Properties.Settings>
          <setting name="name" serializeAs="String">
            <value>value</value>
          </setting>
          <setting name="name2" serializeAs="String">
            <value>value2</value>
          </setting>
       </XX....Properties.Settings>
      </applicationSettings>
    </configuration>

Чтобы получить значение

Properties.Settings.Default.Name

ИЛИ

Properties.Settings.Default [ "имя"]

Hakan
источник