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>

Чи маєте ви якусь пропозицію, що мені робити?

Відповіді:


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 - витратив на це дві години. Повинен бути помилкою.
Ірландський шеф

1
Я теж бачу це в багатоцільовій програмі, моя .net core config працює, але .net Framework config не робить (використовуючи ConfigurationManager)
Майкл Браун

61

Відповідь, яку дав dtsg, працює:

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

АЛЕ, вам потрібно додати посилання на збірку

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

Перейдіть до свого Провідника рішень та клацніть правою кнопкою миші на Список літератури та виберіть Додати посилання . Перейдіть на вкладку Асамблеї та знайдіть Конфігурація .

Довідковий менеджер

Ось приклад мого 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"];

2
У мене, здається, є те саме питання, що і в ОП. Використання VS2015 Я не знаю як і чому, але моя посилання на System.Configuration говорить System.configuration (нижній регістр).
Тім

Це могло б зробити, пояснивши, що там, де немає вкладки "збірки" (принаймні VS2019)
SomeoneElse

21

Дайте це:

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

4
Ваша реалізація цього права повинна бути неправильною. Це безумовно працює для отримання ключових значень з конфігураційного файлу.
dtsg

Не забудьте додати посилання на 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>працював як шарм!
dub stylee

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 = ... дає null, а 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


Це саме те, що мені було потрібно. Дуже корисно, дякую.
Umut OVECOGLU

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 of course.

(Відредагував код на щось, що насправді працює і простіше читати)


Хороша відповідь, але, будь ласка, очистіть, навіщо створювати новий екземпляр AppSettingsReader, коли ви знову створюєте AppSettingsReader, і вам не потрібно вводити рядок, ви можете просто закінчити його на .ToString ().
майтхем-ɯɐɥʇʎɐɯ

2

Дивіться, я зробив те, що, на мою думку, було очевидним:

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

Хоча ця компіляція завжди повертається до нуля.

Це, однак, (зверху) працює:

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

2

Деякі відповіді, здається, трохи від IMO Ось мій взяття близько 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 буде значенням Key Key + "_Emails"

example :   jack@google.com;thad@google.com;

2

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

private String GetConfigValue(String key)
    {
       return System.Web.Configuration.WebConfigurationManager.AppSettings[key].ToString();
    }

1

Ви можете просто ввести:

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

тому що keyє об'єктом і AppSettingsзаймає рядок



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" і все одразу працювало як слід.


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 ["ім'я"]

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