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?

Russ Clark
quelle
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.

womp
quelle
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"];
RAM
quelle
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 .

bsivel
quelle
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.

Shiva
quelle
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"];
Pagey
quelle
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();
Masoud Siahkali
quelle
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.

Otávio Décio
quelle
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.

Victor Naranjo
quelle
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>
Ruslan
quelle
8

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

Tom
quelle
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"]

Wavare Santosh
quelle
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
}
Ashwini Jindal
quelle
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.

Sorgerecht
quelle
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>();
pomber
quelle
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.

rdans
quelle
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"];
Jitendra Suthar
quelle
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.

Tony O'Hagan
quelle
1

Eine andere mögliche Lösung:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
Sherit
quelle
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>
Jason
quelle
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.

Mohammad D.
quelle
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}

martin c
quelle
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);
    }
user3534040
quelle
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.

Chris Catignani
quelle
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.

Nayanajith
quelle
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
JMat
quelle