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.