Lesen von Einstellungen aus app.config oder web.config in .NET


807

Ich arbeite an einer C # -Klassenbibliothek, die Einstellungen aus der Datei web.configoder lesen app.configkann (abhängig davon, ob auf die DLL von einer ASP.NET-Webanwendung oder einer Windows Forms-Anwendung verwiesen wird).

Ich habe das gefunden

ConfigurationSettings.AppSettings.Get("MySetting")

funktioniert, aber dieser Code wurde von Microsoft als veraltet markiert.

Ich habe gelesen, dass ich verwenden sollte:

ConfigurationManager.AppSettings["MySetting"]

Die System.Configuration.ConfigurationManagerKlasse scheint jedoch nicht in einem C # -Klassenbibliotheksprojekt verfügbar zu sein.

Was ist der beste Weg, dies zu tun?


48
Wie ich 4 MSDN Beispiele und Artikel gelesen habe .. Und hier oben gelandet. Fügen Sie einfach eine Referenz hinzu. Warum können sie das nicht einfach sagen? Gute Frage! +1
Piotr Kula

1
Wenn Sie die Einstellungen ebenfalls zurückschreiben möchten , sehen Sie hier, wie Sie dies tun können.
Matt

Antworten:


798

Sie benötigen , um einen Verweis hinzufügen , um System.Configurationin Ihrem Projekt Referenzen Ordner .

Sie sollten auf jeden Fall das ConfigurationManagerüber das Veraltete verwenden ConfigurationSettings.


Vielen Dank! sehr direkte Antwort. Ich habe eine Konsolen-App erstellt! und diese Antwort rette den Tag!
PatsonLeaner

1
Ist dies für .net Core noch korrekt?
Triynko

868

Für eine Beispieldatei app.config wie folgt:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="countoffiles" value="7" />
    <add key="logfilelocation" value="abc.txt" />
  </appSettings>
</configuration>

Sie lesen die obigen Anwendungseinstellungen mit dem folgenden Code:

using System.Configuration;

Möglicherweise müssen Sie System.Configurationin Ihrem Projekt auch einen Verweis hinzufügen, falls noch keiner vorhanden ist. Sie können dann wie folgt auf die Werte zugreifen:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];

124
Ich mag Ihre Antwort mehr als die akzeptierte Antwort. Antworten mit Beispielen machen immer den Trick für mich.
Brendan Vogt

Das hat bei mir funktioniert. Da meine System.Configuration jedoch keinen ConfigurationManager enthält, musste ich ConfigurationSettings verwenden. Ironischerweise bekam ich immer noch eine Warnung, dass es veraltet war.
Nightmare Games

13
Das ist mir auch passiert. Haben Sie versucht, die System.Configuration-Referenz hinzuzufügen? Das Problem ist, dass VS Sie täuscht, indem es Sie glauben lässt, dass Sie es tatsächlich haben. Sie können Intellisense verwenden, um den Namespace System.Configuration abzurufen, aber die ConfigurationManager-Klasse ist nicht vorhanden. Fügen Sie einfach die Referenz hinzu und das behebt das Problem.
Francine DeGrood Taylor

3
@Cricketheads System.Configuration enthält ConfigurationManager. In Ihrem Projekt fehlt wahrscheinlich ein Verweis auf System.Configuration.
TreK

2
Kann mir jemand sagen, warum er denkt, dass System.Configuration nicht standardmäßig hinzugefügt wird? Dies scheint in den meisten Anwendungen ein ziemlich grundlegendes Bedürfnis zu sein.
Todd Vance

89

Update für .NET Framework 4.5 und 4.6; Folgendes funktioniert nicht mehr:

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

Greifen Sie nun über Eigenschaften auf die Einstellungsklasse zu:

string keyvalue = Properties.Settings.Default.keyname;

Weitere Informationen finden Sie unter Verwalten der Anwendungseinstellungen .


1
Eigenschaften seit 2010 .
Nick Westgate

1
Vielen Dank für die Veröffentlichung. Ich habe festgestellt, dass Properties.Settings.Default.MachName funktioniert, konnte aber nicht herausfinden, warum ConfigurationManager.AppSettings ["MachName"] null zurückgegeben hat.
J. Chris Compton

1
Dies beendete meine anhaltende Qual. Vielen Dank. Das Framework sollte Sie warnen, dass der alte Weg veraltet ist.
Neil B

7
Kann nicht bestätigen. Der ConfigurationManager.AppSettings ["someKey"] funktioniert in .NET 4.5, 4.6, 4.7.1
Ivanhoe

1
@Ivanhoe Welche Version von VisualStudio haben Sie verwendet? Der ConfigurationManager.AppSettings ["someKey"] funktionierte mit 4.6.1 und VS 15.8.2, schlug jedoch mit 4.6.1 und VS 15.9.2 für mich fehl.
Kkuilla

37

Klicken Sie mit der rechten Maustaste auf Ihre Klassenbibliothek und wählen Sie im Menü die Option "Referenzen hinzufügen".

Wählen Sie auf der Registerkarte .NET die Option System.Configuration aus. Dies würde die System.Configuration-DLL-Datei in Ihr Projekt aufnehmen.


Nach dem Hinzufügen von Referenz war in der Lage zu tunConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy

29

Ich benutze das und es funktioniert gut für mich:

textBox1.Text = ConfigurationManager.AppSettings["Name"];

48
Der TS gibt ausdrücklich an, dass er denselben Code verwendet, sein Projekt jedoch nicht kompiliert werden kann (aufgrund fehlender Referenzen, wie sich herausstellte). -1 für das Nichtlesen der Frage.
Isantipov

23

Aus Konfiguration lesen:

Sie müssen einen Verweis auf die Konfiguration 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 der Konfiguration speichern:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();

1
Zu Ihrer Information: Google gefällt Ihre Antwort am besten. Erscheint wörtlich, wenn Sie nach "App-Konfigurationseinstellungen abrufen c #" suchen
Steve Gomez

21

Sie müssen dem Projekt einen Verweis auf die Assembly System.Configuration hinzufügen.


18

Möglicherweise fügen Sie die Datei App.config einer DLL-Datei hinzu. App.Config funktioniert nur für ausführbare Projekte, da alle DLL-Dateien die Konfiguration aus der Konfigurationsdatei für die ausgeführte EXE-Datei übernehmen.

Angenommen, Sie haben zwei Projekte in Ihrer Lösung:

  • SomeDll
  • SomeExe

Ihr Problem hängt möglicherweise damit zusammen, dass Sie die Datei app.config in SomeDLL und nicht in SomeExe einfügen. SomeDll kann die Konfiguration aus dem SomeExe-Projekt lesen.


Wow, das ist nicht offensichtlich. Wenn jemand ein Dokument verlinken könnte, das darüber spricht, wäre das fantastisch. Dies ist ein schwieriges Thema.
David Krider

Danke dafür. Ich habe das nirgendwo angegeben.
Parameter

10

Versuche dies:

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

In der Datei web.config sollte dies die nächste Struktur sein:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>

8

Ich hatte das gleiche Problem. Lesen Sie sie einfach so: System.Configuration.ConfigurationSettings.AppSettings ["MySetting"]


4
Laut Microsoft in Bezug auf ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M

2
Diese Methode ist veraltet
GabrielBB

7

web.configwird mit Webanwendungen verwendet. web.configStandardmäßig sind mehrere Konfigurationen für die Webanwendung erforderlich. Sie können web.configfür jeden Ordner unter Ihrer Webanwendung eine haben.

app.configwird für Windows-Anwendungen verwendet. Wenn Sie die Anwendung in Visual Studio erstellen, wird sie automatisch in umbenannt<appname>.exe.config und diese Datei muss zusammen mit Ihrer Anwendung geliefert werden.

Sie können dieselbe Methode verwenden, um die app settingsWerte aus beiden Konfigurationsdateien aufzurufen : System.Configuration.ConfigurationSettings.AppSettings ["Key"]


Es ist auch möglich, System.Configuration.COnfigurationSettings.AppSettings.Get("Key")anstelle der eckigen Klammern zu verwenden.
Mason

7

Da ich den besten Ansatz gefunden habe, systematisch auf Anwendungseinstellungsvariablen zuzugreifen, indem ich eine Wrapper-Klasse über System.Configuration wie unten erstellt habe

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);
        }
    }
}

Jetzt können wir über fest codierte Namen mit einer anderen Klasse wie folgt auf die erforderlichen Einstellungsvariablen zugreifen:

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
}

Hierbei wird die Methode verwendet, auf die das OP hinweist, dass sie als veraltet markiert ist.
user2864740

4

Ich empfehle Ihnen dringend, einen Wrapper für diesen Aufruf zu erstellen . So etwas wie eine ConfigurationReaderServiceund Abhängigkeitsinjektion verwenden , um diese Klasse zu erhalten. Auf diese Weise können Sie diese Konfigurationsdateien zu Testzwecken isolieren.

Verwenden Sie also den ConfigurationManager.AppSettings["something"];vorgeschlagenen Wert und geben Sie diesen Wert zurück. Mit dieser Methode können Sie eine Art Standardrückgabe erstellen, wenn in der .config-Datei kein Schlüssel verfügbar ist.


3
Microsoft hat bereits ein bulit-in Möglichkeit , mehrere Versionen der gleichen Konfigurationsdatei zu verwalten: Build - Konfigurationen , die für jede Build - Konfiguration separate Konfigurationsdateien, die ermöglichen: app.DEBUG.config, app.RELEASE.config, und app.TEST.configetc.
jpaugh

4

Sie können auch Formo verwenden :

Aufbau:

<appSettings>
    <add key="RetryAttempts" value="5" />
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>

Code:

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
Warum um alles in der Welt möchten Sie das tun?
Lukejkw

3

Der Vollständigkeit halber gibt es eine weitere Option, die nur für Webprojekte verfügbar ist: System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

Dies hat den Vorteil, dass keine zusätzliche Referenz hinzugefügt werden muss, sodass dies für einige Personen möglicherweise vorzuziehen ist.


3

Schritt 1: Klicken Sie mit der rechten Maustaste auf die Registerkarte Referenzen, um eine Referenz hinzuzufügen.

Schritt 2: Klicken Sie auf die Registerkarte Baugruppen

Schritt 3: Suchen Sie nach 'System.Configuration'

Schritt 4: Klicken Sie auf OK.

Dann wird es funktionieren.

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

2

Ich erstelle immer eine IConfig-Schnittstelle mit typsicheren Eigenschaften, die für alle Konfigurationswerte deklariert sind. Eine Config-Implementierungsklasse umschließt dann die Aufrufe von System.Configuration. Alle Ihre System.Configuration-Aufrufe befinden sich jetzt an einem Ort, und es ist viel einfacher und sauberer, zu pflegen, zu verfolgen, welche Felder verwendet werden, und ihre Standardwerte zu deklarieren. Ich schreibe eine Reihe von privaten Hilfsmethoden, um gängige Datentypen zu lesen und zu analysieren.

Mit einem IoC- Framework können Sie überall in der Anwendung auf die IConfig-Felder zugreifen, indem Sie die Schnittstelle einfach an einen Klassenkonstruktor übergeben. Sie können dann auch Scheinimplementierungen der IConfig-Schnittstelle in Ihren Komponententests erstellen, sodass Sie jetzt verschiedene Konfigurationswerte und Wertekombinationen testen können, ohne Ihre App.config- oder Web.config-Datei berühren zu müssen.


1

Eine andere mögliche Lösung:

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

1

Ich habe seit ein paar Tagen versucht, eine Lösung für dasselbe Problem zu finden. Ich konnte dies beheben, indem ich einen Schlüssel innerhalb des Appsettings-Tags in der Datei web.config hinzufügte . Dies sollte die DLL-Datei überschreiben, wenn Sie den Helfer verwenden.

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

1

Sie können die folgende Zeile verwenden. In meinem Fall hat es funktioniert: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

Sie müssen darauf achten, dass die obige Codezeile auch die alte Version ist und in neuen Bibliotheken veraltet ist.


1

Der ConfigurationManager ist nicht das, was Sie benötigen, um auf Ihre eigenen Einstellungen zuzugreifen.

Um dies zu tun, sollten Sie verwenden

{YourAppName}.Properties.Settings.{settingName}


1

Ich konnte den folgenden Ansatz für .NET Core-Projekte zum Laufen bringen:

Schritte:

  1. Erstellen Sie in Ihrem Projekt eine appsettings.json (unten angegebenes Format).
  2. Erstellen Sie als Nächstes eine Konfigurationsklasse. Das Format ist unten angegeben.
  3. Ich habe eine Login () -Methode erstellt, um die Verwendung der Konfigurationsklasse anzuzeigen.

    Erstellen Sie appsettings.json in Ihrem Projekt mit Inhalten:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    
    public static class Configuration
    {
        private static IConfiguration _configuration;
    
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
    
            _configuration = builder.Build();
    
        }
        public static Browser GetBrowser()
        {
    
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
    
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
    
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    
    }
    
    
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }

1

Wenn Sie die ConfigurationManagerKlasse brauchen / wollen ...

Möglicherweise müssen Sie System.Configuration.ConfigurationManagervon Microsoft über NuGet Package Manager laden

Tools-> NuGet Package Manager-> Verwalten von NuGet-Paketen zur Lösung ...

Microsoft Docs

Eine Sache, die es wert ist, aus den Dokumenten erwähnt zu werden ...

Wenn Ihre Anwendung schreibgeschützten Zugriff auf ihre eigene Konfiguration benötigt, empfehlen wir die Verwendung der GetSection (String) -Methode. Diese Methode bietet Zugriff auf die zwischengespeicherten Konfigurationswerte für die aktuelle Anwendung, die eine bessere Leistung als die Konfigurationsklasse aufweist.


0

Bitte überprüfen Sie die .NET-Version, an der Sie arbeiten. Sie sollte höher als 4 sein. Außerdem müssen Sie Ihrer Anwendung die System.Configuration-Systembibliothek hinzufügen.


3
Diese Frage wurde vor über 9 Jahren gestellt und hat bereits über 20 Antworten, darunter 2 mit jeweils über 600 Upvotes. Die akzeptierte Antwort besteht darin, einen Verweis auf System.Configuration hinzuzufügen. Diese zusätzliche Antwort bringt keinen Mehrwert. Bestenfalls sollte dies ein Kommentar zur akzeptierten Antwort sein.
Richardissimo

Betreff "höher als 4" : In der Hauptversionsnummer? Oder meinst du "höher als 4.0" ? Oder mit anderen Worten, auf welcher Seite würde sich .NET Framework 4.5 befinden?
Peter Mortensen

-8

Hier ist ein Beispiel: App.config

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>

Dim strPrinterName as string = My.settings.Printer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.