Odczytywanie ustawień z app.config lub web.config w .NET


806

Pracuję nad biblioteką klasy C #, która musi być w stanie odczytać ustawienia z pliku web.configlub app.config(w zależności od tego, czy do DLL odwołuje się aplikacja ASP.NET, czy aplikacja Windows Forms).

Znalazłem to

ConfigurationSettings.AppSettings.Get("MySetting")

działa, ale ten kod został oznaczony przez Microsoft jako przestarzały.

Przeczytałem, że powinienem używać:

ConfigurationManager.AppSettings["MySetting"]

Jednak System.Configuration.ConfigurationManagerklasa nie wydaje się być dostępna z projektu biblioteki klas C #.

Jak najlepiej to zrobić?


48
Jakbym czytał 4 przykłady i artykuły MSDN. I wylądował tutaj. Po prostu dodaj odniesienie ... dlaczego nie mogą tak po prostu powiedzieć. Dobre pytanie! +1
Piotr Kula,

1
Jeśli chcesz również zapisać ustawienia z powrotem , spójrz tutaj, jak to zrobić.
Matt

Odpowiedzi:


797

Musisz dodać odniesienie do folderu odniesieńSystem.Configuration w projekcie .

Zdecydowanie powinieneś korzystać ConfigurationManagerz przestarzałych ConfigurationSettings.


Dziękuję Ci bardzo! bardzo prosta odpowiedź. Budowałem aplikację na konsolę! a ta odpowiedź uratuje dzień!
PatsonLeaner

1
Czy to nadal jest dokładne dla rdzenia .net.
Triynko

867

Przykładowy plik app.config jak poniżej:

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

Czytasz powyższe ustawienia aplikacji, używając kodu pokazanego poniżej:

using System.Configuration;

Może być również konieczne dodanie odniesienia do System.Configurationprojektu, jeśli jeszcze go nie ma. Następnie możesz uzyskać dostęp do takich wartości:

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

124
Twoja odpowiedź podoba mi się bardziej niż odpowiedź zaakceptowana. Odpowiedzi z przykładami zawsze mi pomagają.
Brendan Vogt

To zadziałało dla mnie. Jednak moja System.Configuration nie zawiera ConfigurationManager, więc musiałem użyć ConfigurationSettings. Jak na ironię nadal otrzymałem ostrzeżenie, że jest przestarzałe.
Nightmare Games

13
To mi się też przydarzyło. Czy próbowałeś dodać odwołanie do System.Configuration? Problem polega na tym, że VS oszukuje cię, sprawiając, że myślisz, że go rzeczywiście masz; możesz użyć intellisense, aby uzyskać przestrzeń nazw System.Configuration, ale nie ma ona klasy ConfigurationManager. Po prostu dodaj referencję, która to naprawi.
Francine DeGrood Taylor

3
@Cricketheads System.Configuration zawiera ConfigurationManager, prawdopodobnie brakuje w projekcie odniesienia do System.Configuration.
TreK

2
Czy ktoś może mi powiedzieć, dlaczego ich zdaniem System.Configuracja nie jest dodawana domyślnie ... wydaje się to dość podstawową potrzebą w większości aplikacji.
Todd Vance

89

Aktualizacja dla .NET Framework 4.5 i 4.6; następujące przestaną działać:

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

Teraz uzyskaj dostęp do klasy Setting poprzez Właściwości

string keyvalue = Properties.Settings.Default.keyname;

Aby uzyskać więcej informacji, zobacz Zarządzanie ustawieniami aplikacji .


1
Właściwości od 2010 roku .
Nick Westgate

1
Dziękuję bardzo za opublikowanie tego. Ustaliłem, że Properties.Settings.Default.MachName działa, ale nie mogłem zrozumieć, dlaczego ConfigurationManager.AppSettings [„MachName”] zwrócił wartość null.
J. Chris Compton,

1
To zakończyło moje przedłużające się cierpienie. Dzięki. Ramy powinny ostrzec cię, że stary sposób jest przestarzały.
Neil B

7
Nie mogę potwierdzić. ConfigurationManager.AppSettings [„someKey”] działa w .NET 4.5, 4.6, 4.7.1
Ivanhoe

1
@Ivanhoe Z jakiej wersji VisualStudio korzystałeś? ConfigurationManager.AppSettings [„someKey”] działał z 4.6.1 i VS 15.8.2, ale dla mnie nie powiódł się z 4.6.1 i VS 15.9.2.
kkuilla

37

Kliknij prawym przyciskiem myszy bibliotekę klas i wybierz z menu opcję „Dodaj referencje”.

I z zakładki .NET wybierz System.Configuration. Obejmuje to plik DLL System.Configuration do twojego projektu.


Po dodaniu referencji był w stanie to zrobićConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy

29

Używam tego i działa dobrze dla mnie:

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

48
TS wyraźnie stwierdza, że ​​używa tego samego kodu, ale jego projekt się nie kompiluje (z powodu brakujących referencji, jak się okazało). -1 za brak czytania pytania.
Isantipov

23

Czytaj z konfiguracji:

Musisz dodać odniesienie do konfiguracji:

  1. Otwórz „Właściwości” w swoim projekcie
  2. Przejdź do zakładki „Ustawienia”
  3. Dodaj „Nazwa” 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();

1
FYI: Google najbardziej lubi twoją odpowiedź. Pokazuje się dosłownie, gdy wyszukujesz hasło „pobierz ustawienia konfiguracji aplikacji c #”
Steve Gomez,


18

Być może dodajesz plik App.config do pliku DLL. App.Config działa tylko dla projektów wykonywalnych, ponieważ wszystkie pliki DLL pobierają konfigurację z pliku konfiguracyjnego wykonywanego pliku EXE.

Załóżmy, że masz dwa projekty w swoim rozwiązaniu:

  • SomeDll
  • SomeExe

Twój problem może być związany z faktem, że dołączasz plik app.config do SomeDLL, a nie SomeExe. SomeDll jest w stanie odczytać konfigurację z projektu SomeExe.


Wow, to nie jest oczywiste. Gdyby ktoś mógł połączyć dokument mówiący o tym, byłoby to fantastyczne. Jest to trudny temat do wyszukiwania.
David Krider

Dzięki za to. Nigdzie nie widziałem tego stwierdzonego.
parametr

10

Spróbuj tego:

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

W pliku web.config powinna to być następna struktura:

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

8

Miałem ten sam problem. Przeczytaj je w ten sposób: System.Configuration.ConfigurationSettings.AppSettings [„MySetting”]


4
Według Microsoft w odniesieniu do ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M

2
ta metoda jest przestarzała
GabrielBB

7

web.configjest używany z aplikacjami internetowymi. web.configdomyślnie ma kilka konfiguracji wymaganych dla aplikacji internetowej. Możesz mieć web.configdla każdego folderu w swojej aplikacji internetowej.

app.configjest używany w aplikacjach Windows. Gdy kompilujesz aplikację w Visual Studio, zostanie ona automatycznie zmieniona na nazwę <appname>.exe.configi ten plik musi zostać dostarczony wraz z aplikacją.

Tej samej metody można użyć do wywołania app settingswartości z obu plików konfiguracyjnych: System.Configuration.ConfigurationSettings.AppSettings [„Key”]


Można również użyć System.Configuration.COnfigurationSettings.AppSettings.Get("Key")zamiast nawiasów kwadratowych.
Mason,

7

Ponieważ znalazłem najlepsze podejście do uzyskiwania dostępu do zmiennych ustawień aplikacji w sposób systematyczny, tworząc klasę opakowania nad System.Configuracja jak poniżej

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

Teraz możemy uzyskać dostęp do potrzebnych zmiennych ustawień za pomocą zakodowanych nazw przy użyciu innej klasy, jak poniżej:

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
}

Wykorzystuje to metodę wskazaną przez OP jako przestarzałą.
user2864740,

4

Zdecydowanie zalecamy utworzenie opakowania dla tego połączenia. Coś w rodzaju ConfigurationReaderServicei użyj zastrzyku zależności, aby uzyskać tę klasę. W ten sposób będziesz mógł odizolować te pliki konfiguracyjne do celów testowych.

Więc użyj ConfigurationManager.AppSettings["something"];sugerowanej i zwróć tę wartość. Za pomocą tej metody możesz utworzyć domyślny zwrot, jeśli w pliku .config nie ma żadnego klucza.


3
Microsoft ma już bulit-in sposób zarządzać wieloma wersjami tego samego pliku config: konfiguracje kompilacji , które pozwalają posiadające oddzielne pliki konfiguracyjne dla każdej konfiguracji kompilacji: app.DEBUG.config, app.RELEASE.configi app.TEST.configitp
jpaugh

4

Możesz także użyć Formo :

Konfiguracja:

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

Kod:

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
Dlaczego, u licha, chcesz to zrobić?
lukejkw

3

Dla kompletności istnieje inna opcja dostępna tylko dla projektów internetowych: System.Web.Configuration.WebConfigurationManager.AppSettings [„MySetting”]

Zaletą tego jest to, że nie wymaga dodania dodatkowego odniesienia, więc może być preferowane dla niektórych osób.


3

Krok 1: Kliknij prawym przyciskiem myszy zakładkę odniesienia, aby dodać odniesienie.

Krok 2: Kliknij kartę Zespoły

Krok 3: Wyszukaj „Konfiguracja systemu”

Krok 4: Kliknij OK.

Wtedy to zadziała.

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

2

Zawsze tworzę interfejs IConfig z właściwościami typeafe zadeklarowanymi dla wszystkich wartości konfiguracyjnych. Klasa implementacji Config następnie zawija wywołania do System.Configuration. Wszystkie twoje wywołania System.Configuracja są teraz w jednym miejscu, a utrzymanie i śledzenie, które pola są używane, i deklarowanie ich wartości domyślnych jest o wiele łatwiejsze i czystsze. Piszę zestaw prywatnych metod pomocniczych do odczytu i analizy typowych typów danych.

Za pomocą frameworka IoC można uzyskać dostęp do pól IConfig w dowolnym miejscu w aplikacji, po prostu przekazując interfejs do konstruktora klasy. Następnie możesz również tworzyć symulacje implementacji interfejsu IConfig w testach jednostkowych, dzięki czemu możesz teraz testować różne wartości konfiguracji i kombinacje wartości bez konieczności dotykania pliku App.config lub Web.config.


1

Inne możliwe rozwiązanie:

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

1

Od kilku dni próbuję znaleźć rozwiązanie tego samego problemu. Udało mi się to rozwiązać, dodając klucz w znaczniku appsettings w pliku web.config . Powinno to zastąpić plik .dll podczas korzystania z pomocnika.

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

1

Możesz użyć poniższej linii. W moim przypadku działało: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

Musisz uważać, aby powyższy wiersz kodu był również starą wersją i był przestarzały w nowych bibliotekach.


1

Menedżer konfiguracji ConfigurationManager nie jest tym, czego potrzebujesz, aby uzyskać dostęp do własnych ustawień.

Aby to zrobić, powinieneś użyć

{YourAppName}.Properties.Settings.{settingName}


1

Udało mi się uzyskać poniższe podejście do pracy w projektach .NET Core:

Kroki:

  1. Utwórz appsettings.json (format podany poniżej) w swoim projekcie.
  2. Następnie utwórz klasę konfiguracji. Format znajduje się poniżej.
  3. Utworzyłem metodę Login (), aby pokazać użycie klasy konfiguracji.

    Utwórz appsettings.json w swoim projekcie z zawartością:

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

Jeśli potrzebujesz / chcesz skorzystać z ConfigurationManagerklasy ...

Może być konieczne załadowanie System.Configuration.ConfigurationManagerprzez Microsoft za pomocą NuGet Package Manager

Narzędzia-> Menedżer pakietów NuGet-> Zarządzaj pakietami NuGet dla rozwiązania ...

Dokumenty Microsoft

Warto zwrócić uwagę na dokumenty ...

Jeśli aplikacja potrzebuje dostępu tylko do odczytu do własnej konfiguracji, zalecamy użycie metody GetSection (String). Ta metoda zapewnia dostęp do buforowanych wartości konfiguracji dla bieżącej aplikacji, która ma lepszą wydajność niż klasa Configuration.


0

Sprawdź wersję .NET, nad którą pracujesz. Powinien być wyższy niż 4. I musisz dodać bibliotekę systemową System.Configuration do swojej aplikacji.


3
To pytanie zostało zadane ponad 9 lat temu i ma już ponad 20 odpowiedzi, w tym 2, z których każda ma ponad 600 głosów pozytywnych, akceptowaną odpowiedzią jest dodanie odniesienia do System.Configuration. Ta dodatkowa odpowiedź nie dodaje wartości. W najlepszym przypadku powinien to być komentarz do zaakceptowanej odpowiedzi.
Richardissimo,

Re „wyższy niż 4” : w głównym numerze wersji? A może masz na myśli „wyższy niż 4.0” ? Lub innymi słowy, po której stronie byłby .NET Framework 4.5 ?
Peter Mortensen

-8

Oto przykład: 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.