AppSettings erhalten Wert aus der .config-Datei

172

Ich kann nicht auf Werte in der Konfigurationsdatei zugreifen.

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

.config Datei :

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

Haben Sie einen Vorschlag, was ich tun soll?

Matt
quelle

Antworten:

345

Das funktioniert bei mir:

string value = System.Configuration.ConfigurationManager.AppSettings[key];
Adam
quelle
6
Der von mir bereitgestellte Code erfordert, dass die Datei YourProgram.exe.config im selben Ordner wie YourProgram.exe vorhanden ist. Stellen Sie einfach sicher, dass es da ist. Ein häufiger Fehler besteht darin, die Datei app.config in das Zielverzeichnis zu kopieren, was nicht funktioniert.
Adam
40
Referenz hinzufügen erforderlich System.Configuration.
Prüfsumme
13
Mein .NET 4.5 System.Configuration hat nichtConfigurationManager
qwert_ukg
3
Ich bekomme auch eine Null in einem 4.5-Projekt - habe zwei Stunden damit verbracht. Muss ein Fehler sein.
IrishChieftain
1
Ich sehe dies auch in einer Multi-Target-Anwendung, meine .net-Kernkonfiguration funktioniert, die .net-Framework-Konfiguration jedoch nicht (mit ConfigurationManager)
Michael Brown
61

Die Antwort, die dtsg gab, funktioniert:

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

ABER, müssen Sie eine hinzufügen Montage Bezug auf

Systemkonfiguration

Gehen Sie zu Ihrem Projektmappen - Explorer und der rechten Maustaste auf Verweise und wählen Sie Verweis hinzufügen . Wählen Sie die Baugruppen aus Registerkarte und suchen Sie nach Konfiguration .

Referenzmanager

Hier ist ein Beispiel von mir 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>

Was Sie auf folgende Weise erhalten können:

string adminName = ConfigurationManager.AppSettings["AdminName"];
Rotger
quelle
2
Ich habe anscheinend das gleiche Problem wie OP. Verwenden von VS2015. Ich weiß nicht wie oder warum, aber mein Verweis auf System.Configuration sagt System.configuration (Kleinbuchstaben).
Tim
Dies könnte eine Erweiterung bedeuten, um abzudecken, wo keine Registerkarte "Baugruppen" vorhanden ist (mindestens VS2019)
SomeoneElse
21

Probieren Sie es aus:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
dtsg
quelle
4
Ihre Implementierung muss falsch sein. Dies funktioniert definitiv zum Abrufen von Schlüsselwerten aus einer Konfigurationsdatei.
dtsg
Stellen Sie sicher, dass Sie in den Referenzen für Ihr Projekt einen Verweis auf System.Configuration hinzufügen!
GrahamJ
19

Aus Konfiguration lesen:

Sie müssen einen Verweis auf Config hinzufügen

  1. Öffnen Sie "Eigenschaften" in Ihrem Projekt
  2. Gehen Sie zur Registerkarte "Einstellungen"
  3. Fügen Sie "Name" und "Wert" hinzu
  4. Holen Sie sich Wert mit folgendem Code:
string value = Properties.Settings.Default.keyname;

In Konfiguration speichern:

Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();
Masoud Siahkali
quelle
4
Sehr hilfreich, da alle anderen Antworten mit ConfigurationManager nicht funktionieren, wenn Sie Ihre Werte wie beschrieben auf den Registerkarten Einstellungen der Projekteigenschaften hinzufügen. Vielen Dank.
The Dumb Radish
2
Das hat auch bei mir funktioniert. Ich bekam eine nullZeichenfolge mit den oben genannten Empfehlungen, Properties.Settings.Default.<keyName>arbeitete aber wie ein Zauber!
Dub Stylee
1
Perfekt ! Ich habe danach gesucht :) Danke!
HSQL
@ Masoud Siahkali, Letzte Woche habe ich so ziemlich alles versucht, was Sie hier in meinem eigenen Projekt haben, aber die Werte, die vom Benutzer zur Laufzeit geändert wurden (vorerst nur über die VS-GUI ausgeführt), bleiben nicht instanzübergreifend erhalten. Meine Frage: stackoverflow.com/questions/61018443/… . Ich habe immer noch nicht herausgefunden, warum vom Benutzer geänderte Einstellungen dieser Werte nicht
beibehalten werden
8

Ich benutze:

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

Wobei value1 = ... und value3 = ... null ergibt und value2 = ... funktioniert

Dann habe ich beschlossen, die interne app.config durch zu ersetzen:

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

Verwenden von VS2012 .net 4

Kkloe
quelle
Genau das habe ich gebraucht. Wirklich hilfreich, danke.
Umut OVECOGLU
5

Stellen Sie in der app/web.configDatei die folgende Konfiguration ein:

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

Dann können Sie in Ihrem Code darauf zugreifen, indem Sie diese Zeile eingeben:

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

* Beachten Sie, dass dies gut für .net4.5.xund funktioniert .net4.6.x; aber nicht arbeiten für .net core. Viele Grüße: Rafael

Rafael Andrs Cspedes Basterio
quelle
3

Ich komme nach langer Zeit wieder darauf zurück ...

Angesichts des Niedergangs von ConfigurationManager für alle, die noch nach einer Antwort auf diesen Versuch suchen (zum Beispiel):

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

Benötigt natürlich System.Configuration.

(Der Code wurde so bearbeitet, dass er tatsächlich funktioniert und einfacher zu lesen ist.)

Mike Dean
quelle
Gute Antwort, aber bitte bereinigen Sie, warum Sie eine neue Instanz von AppSettingsReader erstellen, wenn Sie AppSettingsReader erneut erstellen und keinen String umwandeln müssen. Sie können ihn einfach beenden, um .ToString () zu überschreiben.
Maytham - 12.
2

Sehen Sie, ich habe getan, was ich für das Offensichtliche hielt:

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

Während das kompiliert wird, gibt es immer null zurück.

Dies funktioniert jedoch (von oben):

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
Steve
quelle
2

Einige der Antworten scheinen ein wenig von IMO abzuweichen. Hier ist meine Einstellung um 2016

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

Stelle sicher System.Configuration verwiesen wird.

Die Frage fragt nach dem Wert eines Appsettings Schlüssels

Was mit Sicherheit sein sollte

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

Hier ist eine Wendung, in der Sie Werte gruppieren können (nicht für diese Frage)

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

emails wird der Wert des Umgebungsschlüssels + "_Emails" sein

example :   jack@google.com;thad@google.com;
Tom Stickel
quelle
2

Für Webanwendungen schreibe ich normalerweise diese Methode und rufe sie einfach mit dem Schlüssel auf.

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

Sie können einfach Folgendes eingeben:

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

weil keyist ein Objekt und AppSettingsnimmt eine Zeichenfolge

Sopran
quelle
1
ConfigurationManager.RefreshSection("appSettings")
string value = System.Configuration.ConfigurationManager.AppSettings[key];
Musikmusik
quelle
1

Oder Sie können entweder verwenden

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

//Gets the values associated with the specified key from the System.Collections.Specialized.NameValueCollection
Davit Mikuchadze
quelle
0

Mein einfacher Test schlug ebenfalls fehl, gemäß den Anweisungen der anderen Antworten hier - bis mir klar wurde, dass die Konfigurationsdatei, die ich meiner Desktopanwendung hinzugefügt habe, den Namen "App1.config" erhielt. Ich habe es in "App.config" umbenannt und alles hat sofort so funktioniert, wie es sollte.

BCA
quelle
0
  1. Öffnen Sie "Eigenschaften" in Ihrem Projekt
  2. Gehen Sie zur Registerkarte "Einstellungen"
  3. Fügen Sie "Name" und "Wert" hinzu

CODE WIRD AUTOMATISCH ERZEUGT

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

Um einen Wert zu erhalten

Properties.Settings.Default.Name

ODER

Properties.Settings.Default ["name"]

Hakan
quelle