AppSettings pobierają wartość z pliku .config


172

Nie mogę uzyskać dostępu do wartości w pliku konfiguracyjnym.

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

plik .config :

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

Czy masz jakieś sugestie, co mam zrobić?

Odpowiedzi:


345

To działa dla mnie:

string value = System.Configuration.ConfigurationManager.AppSettings[key];

6
Kod, który podałem, wymaga, aby plik YourProgram.exe.config znajdował się w tym samym folderze co YourProgram.exe. Tylko upewnij się, że tam jest. Częstym błędem jest kopiowanie pliku app.config do katalogu docelowego, co nie będzie działać.
— Adam

40
Wymagaj dodania odniesienia System.Configuration.
— suma kontrolna

13
Mój .NET 4.5 System.Configuration nieConfigurationManager
— qwert_ukg

3
Otrzymuję też wartość null w projekcie 4.5 - spędziłem nad tym dwie godziny .. To musi być błąd.
— IrishChieftain

1
Ja również widzę to w aplikacji obsługującej wiele celów, moja konfiguracja .net core działa, ale konfiguracja .net Framework nie (przy użyciu ConfigurationManager)
— Michael Brown

61

Odpowiedź, którą udzielił dtsg, działa:

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

ALE musisz dodać odwołanie do zestawu do

Konfiguracja systemu

Przejdź do Eksploratora rozwiązań i kliknij prawym przyciskiem myszy Referencje i wybierz Dodaj odwołanie . Wybierz kartę Zespoły i wyszukaj Konfiguracja .

Menedżer referencji

Oto przykład mojego pliku 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>

Które możesz zdobyć w następujący sposób:

string adminName = ConfigurationManager.AppSettings["AdminName"];

2
Wydaje mi się, że mam ten sam problem co OP. Korzystanie z VS2015. Nie wiem jak i dlaczego, ale moje odniesienie do System.Configuration mówi System.configuration (małe litery).
— Tim

Może to przydać się w przypadku eksploracji w celu pokrycia miejsca, w którym nie ma karty „zespoły” (przynajmniej VS2019)
— SomeoneElse

21

Spróbuj:

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

4
Twoja implementacja musi być nieprawidłowa. To zdecydowanie działa w przypadku pobierania wartości kluczy z pliku konfiguracyjnego.
— dtsg

Upewnij się, że dodałeś odwołanie do System.Configuration w referencjach swojego projektu!
— GrahamJ

19

Odczytaj z konfiguracji:

Musisz dodać odwołanie do Config

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

4
Naprawdę pomocne, ponieważ wszystkie inne odpowiedzi za pomocą ConfigurationManager nie działają, jeśli dodasz swoje wartości na kartach Ustawienia we właściwościach projektu, tak jak opisano. Dzięki.
— The Dumb Radish

2
U mnie to też zadziałało. Dostałem nullsznurek z powyższymi zaleceniami, ale Properties.Settings.Default.<keyName>działał jak marzenie!
— dub stylee

1
Idealny ! Szukałem tego :) Dziękuję!
— HSQL

@Masoud Siahkali, W zeszłym tygodniu wypróbowałem prawie wszystko, co masz tutaj, w moim własnym projekcie, ale wartości, po zmianie przez użytkownika w czasie wykonywania (na razie tylko uruchomienie go z GUI VS) nie są zachowywane między instancjami. Moje pytanie: stackoverflow.com/questions/61018443/… . Nadal nie zorientowałem się, dlaczego zmienione przez użytkownika ustawienia tych wartości nie są zachowywane ...
— marky

8

Ja używam:

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

Gdzie value1 = ... i value3 = ... daje null, a value2 = ... działa

Wtedy zdecydowałem się zamienić wewnętrzny plik app.config na:

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

Korzystanie z VS2012 .net 4


Właśnie tego potrzebowałem. Naprawdę pomocne, dzięki.
— Umut OVECOGLU,

5

W app/web.configpliku ustaw następującą konfigurację:

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

możesz uzyskać do tego dostęp w swoim kodzie, umieszczając w tym wierszu:

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

* Zauważ, że to działa dobrze w przypadku .net4.5.xi .net4.6.x; ale nie pracuj dla .net core. Z poważaniem: Rafael


3

Wracając do tego po długim czasie ...

Biorąc pod uwagę upadek ConfigurationManager, dla każdego, kto wciąż szuka odpowiedzi na tę próbę (na przykład):

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

Oczywiście wymaga konfiguracji System.Configuration.

(Zmodyfikowałem kod do czegoś, co faktycznie działa i jest prostsze do odczytania)


Dobra odpowiedź, ale posprzątaj, po co tworzyć nowe wystąpienie AppSettingsReader, gdy ponownie tworzysz AppSettingsReader, i nie musisz rzucać ciągu, możesz po prostu zakończyć to nadpisaniem .ToString ().
— maytham-ɯɐɥʇʎɐɯ

2

Widzisz, zrobiłem to, co uważałem za oczywiste:

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

Podczas kompilacji zawsze zwraca null.

To jednak (z góry) działa:

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

2

Niektóre odpowiedzi wydają się być nieco odbiegające od IMO Oto moja opinia z około 2016 roku

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

Upewnij się, że System.Configurationistnieje odniesienie.

Pytanie dotyczy wartości klucza appSettings

Która z pewnością POWINNA być

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

Oto zwrot akcji, w którym możesz grupować wartości (nie w tym pytaniu)

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

emails będzie wartością klucza środowiska + „_Emails”

example :   jack@google.com;thad@google.com;

2

W przypadku aplikacji internetowych zwykle napiszę tę metodę i po prostu wywołam ją za pomocą klucza.

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

1

Możesz po prostu wpisać:

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

ponieważ keyjest obiektem i AppSettingsprzyjmuje ciąg


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

1

Lub możesz użyć

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

//Gets the values associated with the specified key from the System.Collections.Specialized.NameValueCollection

0

Mój prosty test również się nie powiódł, postępując zgodnie z radą innych odpowiedzi tutaj - dopóki nie zdałem sobie sprawy, że plik konfiguracyjny, który dodałem do mojej aplikacji komputerowej, otrzymał nazwę „App1.config”. Zmieniłem nazwę na „App.config” i wszystko od razu działało tak, jak powinno.


0
  1. Otwórz „Właściwości” w swoim projekcie
  2. Przejdź do karty „Ustawienia”
  3. Dodaj „Nazwę” i „Wartość”

KOD ZOSTANIE GENEROWANY AUTOMATYCZNIE

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

Aby uzyskać wartość

Właściwości.Settings.Default.Name

LUB

Properties.Settings.Default ["nazwa"]

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.