2009-07-27 6 views
569

Ich arbeite an einer C# -Klassenbibliothek, die Einstellungen aus der Datei web.config oder app.config lesen kann (abhängig davon, ob die DLL von einem ASP referenziert wird .NET-Webanwendung oder eine Windows Forms-Anwendung).Lesen von Einstellungen aus app.config oder web.config in .net

Ich habe festgestellt, dass

ConfigurationSettings.AppSettings.Get("MySetting") 

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

Ich habe gelesen, dass ich verwenden soll:

ConfigurationManager.AppSettings["MySetting"] 

jedoch die System.Configuration.ConfigurationManager Klasse scheint nicht von einem C# Klassenbibliothek-Projekt zur Verfügung steht.

Weiß jemand, was der beste Weg ist, dies zu tun?

+22

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

+0

Wenn du ** die Einstellungen auch ** schreiben willst, schaue ** [hier] (https://Stackoverflow.com/a/11841175/1016343) ** wie du es machen kannst. – Matt

+0

Mögliches Duplikat von [Vor- und Nachteile von AppSettings vs applicationSettings (.NET app.config/Web.config)] (https://stackoverflow.com/questions/460935/pros-and-cons-of-appsettings-vs-applicationsettings -net-app-config-web-config) – Matt

Antwort

613

Sie erhalten eine Referenz-System.Configuration zu hinzufügen müssen in Referenzen des Projekts Ordner.

Sie sollten auf jeden Fall die ConfigurationManager über die veraltete ConfigurationSettings verwenden.

18

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

34

Klicken Sie mit der rechten Maustaste auf Ihre Klassenbibliothek und wählen Sie die Option "Referenzen hinzufügen" aus dem Menü; und schließlich auf der Registerkarte .NET System.Configuration. Dies würde die System.Configuration-DLL in Ihr Projekt einschließen.

+0

Nach dem Hinzufügen der Referenz, war in der Lage zu tun 'ConfigurationManager.ConnectionStrings [0] .ConnectionString' – SushiGuy

27

Im mit diesem und es funktioniert gut für mich

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

Der TS explizit besagt, dass er den gleichen Code verwendet, aber sein Projekt nicht kompilieren (aufgrund fehlender Referenzen, wie sich herausstellte). -1 für nicht die Frage zu lesen. – Isantipov

1

web.config mit Web-Anwendungen verwendet wird. web.config werden standardmäßig mehrere Konfigurationen für die Webanwendung benötigt. Sie können einen web.config für jeden Ordner unter Ihrer Webanwendung haben.

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

können Sie die gleiche Methode verwenden, um die app settings Werte von den beiden Konfigurationsdateien zu nennen:

System.Configuration.COnfigurationSettings.AppSettings["Key"] 
+0

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

625

Für Probe App.config wie unten:

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

Sie die oben genannten App-Einstellungen lesen Code siehe unten:

using System.Configuration; 

Möglicherweise müssen Sie auch einen Verweis auf Sys hinzufügen tem.Configuration in Ihrem Projekt, wenn es noch keins gibt. Sie können dann auf die Werte wie folgt zugreifen:

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

Hoffe, das hilft!

+83

Ich mag deine Antwort mehr als die angenommene Antwort. Antworten mit Beispielen tun immer den Trick für mich. –

+2

Warum die Upvotes? Dies beantwortet die Frage überhaupt nicht. – Gigo

+14

@Gigo zeigt * wie * den Konfigurationsmanager einschließlich einer App zu verwenden.Konfigurationsbeispiel sowie Beispielcode. Die angenommene Antwort nicht. – crashmstr

2

Ich empfehle dringend, einen Wrapper für diesen Anruf zu erstellen. So etwas wie ein ConfigurationReaderService und verwenden Abhängigkeitsinjektion, um diese Klasse zu erhalten. Auf diese Weise können Sie diese Konfigurationsdateien für Testzwecke isolieren.

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

+0

Microsoft hat bereits eine eingebaute Möglichkeit, mehrere Versionen derselben Konfigurationsdatei zu verwalten: [Build-Konfigurationen] (https://msdn.microsoft.com/en-us/library/kkz9kefa.aspx), die eine separate Konfiguration ermöglichen Dateien für jede Build-Konfiguration: 'app.DEBUG.config',' app.RELEASE.config' und 'app.TEST.config' usw. – jpaugh

0

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

12

Möglicherweise fügen Sie die App.config-Datei zu einer DLL hinzu. App.Config funktioniert nur für ausführbare Projekte, da alle DLLs die Konfiguration aus der Konfigurationsdatei für die exe ausführen.

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

  • SomeDll
  • SomeExe

Ihr Problem auf die Tatsache releated werden könnte, dass Sie die app.config SomeDLL sind einschließlich und nicht SomeExe. SomeDll kann die Konfiguration aus dem SomeExe-Projekt lesen.

+0

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

5

ich das gleiche Problem hatte, las sie nur auf diese Weise:

System.Configuration.ConfigurationSettings.AppSettings["MySetting"] 
+4

Laut Microsoft in Bezug auf ConfigurationSettings.AppSettings 'Diese Methode ist veraltet, wurde durch System.Configuration ersetzt! System.Configuration.ConfigurationManager.AppSettings' –

+2

Diese Methode ist veraltet – GabrielBB

5
diese

Versuchen:

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

Diese Frage hat bereits gut angenommene Antworten .. was willst du sagen??? – tod

1

auch:

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

In web.config nächsten Struktur sein sollte können Sie formo verwenden:

Config:

<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 in aller Welt möchten Sie das tun? – lukejkw

46

Update für Framework 4.5 und 4.6; Folgendes wird nicht mehr funktionieren:

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

nun die Einstellung Klasse über Eigenschaften zugreifen:

string keyvalue= Properties.Settings.Default.keyname; 

Siehe Managing Application Settings für weitere Informationen.

+1

Eigenschaften seit [2010] (https://msdn.microsoft.com/library/a65txexh (v = vs.100) .aspx]). –

+0

Vielen Dank für das Posten. Ich habe festgestellt, dass Properties.Settings.Default.MachName funktioniert hat, aber ich konnte nicht herausfinden, warum ConfigurationManager.AppSettings ["MachName"] null zurückgegeben hat. –

+0

Dank @bsivel d – Nezir

0

Ich erstelle immer eine IConfig-Schnittstelle mit typsicheren Eigenschaften, die für alle Konfigurationswerte deklariert sind. Eine Config-Implementierungsklasse wickelt dann die Aufrufe von System.Configuration ab. Alle Ihre System.Configuration-Aufrufe sind jetzt an einem Ort, so viel einfacher und sauberer zu verwalten und zu verfolgen, welche Felder verwendet werden und ihre Standardwerte deklarieren. Ich schreibe eine Reihe von privaten Hilfsmethoden zum Lesen und Parsen von gemeinsamen Datentypen.

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

0

Nur der Vollständigkeit halber, gibt es eine weitere Option für Web-Projekte nur:

System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"] 

Der Vorteil davon ist, dass es keine zusätzliche Referenz benötigt hinzugefügt werden, so kann für einige Menschen vorzuziehen.

0

Eine andere mögliche Lösung:

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

lesen Von Config:

Sie werden einen Verweis auf Config

  1. Open "Eigenschaften" auf Ihrem Projekt
  2. Go hinzufügen müssen zu Registerkarte "Einstellungen"
  3. Hinzufügen "Name" und "Wert"
  4. Wert mit folgendem Code abrufen:

    string value = Properties.Settings.Default.keyname;

Speichern In den Config:

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

FYI: Google mag deine Antwort am besten. Wird wörtlich angezeigt, wenn Sie nach "get app config settings C#" suchen –

1

Wie ich am besten Ansatz gefunden App-Einstellungen Variablen in systematischer Weise den Zugriff durch eine Wrapper-Klasse über System.Configuration machen, wie unten

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 Wir können auf die benötigten Einstellungsvariablen zugreifen, indem wir hart codierte Namen verwenden, indem wir eine andere Klasse wie unten verwenden

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 
    } 
+0

Dies verwendet die Methode, auf die das OP hinweist, als veraltet markiert. – user2864740

-3

für ex:

<applicationSettings> 
     <MyApp.My.MySettings> 
      <setting name="Printer" serializeAs="String"> 
       <value>1234 </value> 
      </setting> 
     </MyApp.My.MySettings> 
    </applicationSettings> 
Dim strPrinterName as string= My.settings.Printer 
Verwandte Themen