AppSettings pobierają wartość z pliku .config

172

Nie mogę uzyskać dostępu do wartości w pliku konfiguracyjnym.

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

plik .config :

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

Czy masz jakieś sugestie, co mam zrobić?

Matt
źródło

Odpowiedzi:

345

To działa dla mnie:

string value = System.Configuration.ConfigurationManager.AppSettings[key];
Adam
źródło
6
Kod, który podałem, wymaga, aby plik YourProgram.exe.config znajdował się w tym samym folderze co YourProgram.exe. Tylko upewnij się, że tam jest. Częstym błędem jest kopiowanie pliku app.config do katalogu docelowego, co nie będzie działać.
Adam
40
Wymagaj dodania odniesienia System.Configuration.
suma kontrolna
13
Mój .NET 4.5 System.Configuration nieConfigurationManager
qwert_ukg
3
Otrzymuję też wartość null w projekcie 4.5 - spędziłem nad tym dwie godziny .. To musi być błąd.
IrishChieftain
1
Ja również widzę to w aplikacji obsługującej wiele celów, moja konfiguracja .net core działa, ale konfiguracja .net Framework nie (przy użyciu ConfigurationManager)
Michael Brown
61

Odpowiedź, którą udzielił dtsg, działa:

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

ALE musisz dodać odwołanie do zestawu do

Konfiguracja systemu

Przejdź do Eksploratora rozwiązań i kliknij prawym przyciskiem myszy Referencje i wybierz Dodaj odwołanie . Wybierz kartę Zespoły i wyszukaj Konfiguracja .

Menedżer referencji

Oto przykład mojego pliku 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>

Które możesz zdobyć w następujący sposób:

string adminName = ConfigurationManager.AppSettings["AdminName"];
rotgers
źródło
2
Wydaje mi się, że mam ten sam problem co OP. Korzystanie z VS2015. Nie wiem jak i dlaczego, ale moje odniesienie do System.Configuration mówi System.configuration (małe litery).
Tim
Może to przydać się w przypadku eksploracji w celu pokrycia miejsca, w którym nie ma karty „zespoły” (przynajmniej VS2019)
SomeoneElse
21

Spróbuj:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
dtsg
źródło
4
Twoja implementacja musi być nieprawidłowa. To zdecydowanie działa w przypadku pobierania wartości kluczy z pliku konfiguracyjnego.
dtsg
Upewnij się, że dodałeś odwołanie do System.Configuration w referencjach swojego projektu!
GrahamJ
19

Odczytaj z konfiguracji:

Musisz dodać odwołanie do Config

  1. Otwórz „Właściwości” w swoim projekcie
  2. Przejdź do karty „Ustawienia”
  3. Dodaj „Nazwę” i „Wartość”
  4. Uzyskaj wartość za pomocą następującego kodu:
string value = Properties.Settings.Default.keyname;

Zapisz w konfiguracji:

Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();
Masoud Siahkali
źródło
4
Naprawdę pomocne, ponieważ wszystkie inne odpowiedzi za pomocą ConfigurationManager nie działają, jeśli dodasz swoje wartości na kartach Ustawienia we właściwościach projektu, tak jak opisano. Dzięki.
The Dumb Radish
2
U mnie to też zadziałało. Dostałem nullsznurek z powyższymi zaleceniami, ale Properties.Settings.Default.<keyName>działał jak marzenie!
dub stylee
1
Idealny ! Szukałem tego :) Dziękuję!
HSQL
@Masoud Siahkali, W zeszłym tygodniu wypróbowałem prawie wszystko, co masz tutaj, w moim własnym projekcie, ale wartości, po zmianie przez użytkownika w czasie wykonywania (na razie tylko uruchomienie go z GUI VS) nie są zachowywane między instancjami. Moje pytanie: stackoverflow.com/questions/61018443/… . Nadal nie zorientowałem się, dlaczego zmienione przez użytkownika ustawienia tych wartości nie są zachowywane ...
marky
8

Ja używam:

    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"];

Gdzie value1 = ... i value3 = ... daje null, a value2 = ... działa

Wtedy zdecydowałem się zamienić wewnętrzny plik app.config na:

// 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"];

Korzystanie z VS2012 .net 4

Kkloe
źródło
Właśnie tego potrzebowałem. Naprawdę pomocne, dzięki.
Umut OVECOGLU,
5

W app/web.configpliku ustaw następującą konfigurację:

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

możesz uzyskać do tego dostęp w swoim kodzie, umieszczając w tym wierszu:

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

* Zauważ, że to działa dobrze w przypadku .net4.5.xi .net4.6.x; ale nie pracuj dla .net core. Z poważaniem: Rafael

Rafael Andrs Cspedes Basterio
źródło
3

Wracając do tego po długim czasie ...

Biorąc pod uwagę upadek ConfigurationManager, dla każdego, kto wciąż szuka odpowiedzi na tę próbę (na przykład):

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

Oczywiście wymaga konfiguracji System.Configuration.

(Zmodyfikowałem kod do czegoś, co faktycznie działa i jest prostsze do odczytania)

Mike Dean
źródło
Dobra odpowiedź, ale posprzątaj, po co tworzyć nowe wystąpienie AppSettingsReader, gdy ponownie tworzysz AppSettingsReader, i nie musisz rzucać ciągu, możesz po prostu zakończyć to nadpisaniem .ToString ().
maytham-ɯɐɥʇʎɐɯ
2

Widzisz, zrobiłem to, co uważałem za oczywiste:

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

Podczas kompilacji zawsze zwraca null.

To jednak (z góry) działa:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
Steve
źródło
2

Niektóre odpowiedzi wydają się być nieco odbiegające od IMO Oto moja opinia z około 2016 roku

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

Upewnij się, że System.Configurationistnieje odniesienie.

Pytanie dotyczy wartości klucza appSettings

Która z pewnością POWINNA być

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

Oto zwrot akcji, w którym możesz grupować wartości (nie w tym pytaniu)

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

emails będzie wartością klucza środowiska + „_Emails”

example :   jack@google.com;thad@google.com;
Tom Stickel
źródło
2

W przypadku aplikacji internetowych zwykle napiszę tę metodę i po prostu wywołam ją za pomocą klucza.

private String GetConfigValue(String key)
    {
       return System.Web.Configuration.WebConfigurationManager.AppSettings[key].ToString();
    }
suulizyna
źródło
1

Możesz po prostu wpisać:

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

ponieważ keyjest obiektem i AppSettingsprzyjmuje ciąg

Sopran
źródło
1
ConfigurationManager.RefreshSection("appSettings")
string value = System.Configuration.ConfigurationManager.AppSettings[key];
musicinmusic
źródło
1

Lub możesz użyć

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

//Gets the values associated with the specified key from the System.Collections.Specialized.NameValueCollection
Davit Mikuchadze
źródło
0

Mój prosty test również się nie powiódł, postępując zgodnie z radą innych odpowiedzi tutaj - dopóki nie zdałem sobie sprawy, że plik konfiguracyjny, który dodałem do mojej aplikacji komputerowej, otrzymał nazwę „App1.config”. Zmieniłem nazwę na „App.config” i wszystko od razu działało tak, jak powinno.

BCA
źródło
0
  1. Otwórz „Właściwości” w swoim projekcie
  2. Przejdź do karty „Ustawienia”
  3. Dodaj „Nazwę” i „Wartość”

KOD ZOSTANIE GENEROWANY AUTOMATYCZNIE

    <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>

Aby uzyskać wartość

Właściwości.Settings.Default.Name

LUB

Properties.Settings.Default ["nazwa"]

Hakan
źródło