Le impostazioni delle app ottengono valore dal file .config


172

Non riesco ad accedere ai valori nel file di configurazione.

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

File .config :

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

Hai qualche suggerimento cosa devo fare?

Risposte:


345

Questo funziona per me:

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

6
Il codice fornito richiede che il file YourProgram.exe.config esista nella stessa cartella di YourProgram.exe. Assicurati solo che sia lì. Un errore comune è quello di copiare il file app.config nella directory di destinazione, che non funzionerà.
Adam,

40
Richiedi aggiungere riferimento System.Configuration.
checksum

13
Il mio .NET 4.5 System.Configuration non haConfigurationManager
qwert_ukg

3
Sto anche ottenendo un nulla in un progetto 4.5 - ho trascorso due ore su questo .. Deve essere un bug.
IrishChieftain

1
Anch'io lo vedo in un'applicazione multi-target, la mia configurazione core .net funziona ma la configurazione del framework .net no (usando ConfigurationManager)
Michael Brown,

61

La risposta che dtsg ha dato funziona:

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

MA, è necessario aggiungere un riferimento di assembly a

Configurazione di sistema

Vai a Esplora soluzioni e fai clic con il pulsante destro del mouse su Riferimenti e seleziona Aggiungi riferimento . Selezionare la scheda Assiemi e cercare la configurazione .

Responsabile di riferimento

Ecco un esempio del mio 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>

Che puoi ottenere nel modo seguente:

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

2
Sembra che abbia lo stesso problema di OP. Utilizzando VS2015. Non so come o perché, ma il mio riferimento a System.Configuration dice System.configuration (lettere minuscole).
Tim

Questo potrebbe fare con l'espansione per coprire dove non c'è la scheda "assemblee" (almeno VS2019)
SomeoneElse

21

Prova questo:

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

4
La tua implementazione deve essere errata. Questo funziona sicuramente per il recupero di valori chiave da un file di configurazione.
dtsg,

Assicurati di aggiungere un riferimento a System.Configuration nei riferimenti per il tuo progetto!
GrahamJ,

19

Leggi da Config:

Dovrai aggiungere un riferimento a Config

  1. Apri "Proprietà" sul tuo progetto
  2. Vai alla scheda "Impostazioni"
  3. Aggiungi "Nome" e "Valore"
  4. Ottieni valore utilizzando il seguente codice:
string value = Properties.Settings.Default.keyname;

Salva in Config:

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

4
È davvero utile poiché tutte le altre risposte che utilizzano ConfigurationManager non funzionano se si aggiungono i valori nelle schede Impostazioni delle proprietà del progetto come descritto. Grazie.
The Dumb Ravish

2
Questo ha funzionato anche per me. Stavo ottenendo una nullstringa con i consigli di cui sopra, ma ha Properties.Settings.Default.<keyName>funzionato come un fascino!
dub stylee

1
Perfetto ! Lo stavo cercando :) Grazie!
HSQL

@Masoud Siahkali, La scorsa settimana ho provato praticamente quello che hai qui nel mio progetto, ma i valori, se modificati dall'utente in fase di esecuzione (per il momento eseguendolo dalla VS GUI) non persistono tra le istanze. La mia domanda: stackoverflow.com/questions/61018443/… . Non ho ancora capito perché le impostazioni modificate dall'utente di quei valori non persistono ...
marky

8

Sto usando:

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

Dove value1 = ... e value3 = ... restituisce null e value2 = ... funziona

Quindi ho deciso di sostituire l'app.config interno con:

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

Utilizzo di VS2012 .net 4


Questo è esattamente quello di cui avevo bisogno. Davvero utile, grazie.
Umut OVECOGLU,

5

Nel app/web.configfile impostare la seguente configurazione:

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

quindi puoi accedervi nel tuo codice inserendo questa riga:

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

* Nota che questo funziona benissimo per .net4.5.xe .net4.6.x; ma non funzionano per .net core. Cordiali saluti: Rafael


3

Tornando a questo dopo tanto tempo ...

Data la scomparsa di ConfigurationManager, per chiunque cerchi ancora una risposta a questo tentativo (ad esempio):

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

Richiede System.Configuration ovviamente.

(Modificato il codice su qualcosa che funziona davvero ed è più semplice da leggere)


Buona risposta, ma si prega di ripulire, perché creare una nuova istanza di AppSettingsReader quando si ricrea nuovamente AppSettingsReader e non è necessario eseguire il cast della stringa, è possibile terminarla con .ToString () override.
Maytham-ɯɐɥʇʎɐɯ

2

Vedi, ho fatto quello che pensavo fosse ovvio:

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

Mentre viene compilato, restituisce sempre null.

Questo tuttavia (dall'alto) funziona:

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

2

Alcune delle risposte sembrano un po 'fuori dall'IMO Ecco la mia opinione sul 2016

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

Assicurarsi che System.Configurationsia referenziato.

La domanda è chiedere il valore di una chiave per le impostazioni

Che sicuramente DOVREBBE essere

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

Ecco una svolta in cui è possibile raggruppare valori (non per questa domanda)

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

emails sarà il valore di Environment Key + "_Emails"

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

2

Per l'applicazione web, normalmente scrivo questo metodo e lo chiamo semplicemente con il tasto.

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

1

Puoi semplicemente digitare:

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

perché keyè un oggetto e AppSettingsaccetta una stringa


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

1

Oppure puoi usare entrambi

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

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

0

Anche il mio semplice test ha avuto esito negativo, seguendo i consigli delle altre risposte qui - fino a quando mi sono reso conto che al file di configurazione che ho aggiunto alla mia applicazione desktop è stato assegnato il nome "App1.config". L'ho rinominato in "App.config" e tutto ha funzionato immediatamente come doveva.


0
  1. Apri "Proprietà" sul tuo progetto
  2. Vai alla scheda "Impostazioni"
  3. Aggiungi "Nome" e "Valore"

IL CODICE SARÀ GENERATO AUTOMATICAMENTE

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

Per ottenere un valore

Properties.Settings.Default.Name

O

Properties.Settings.Default [ "nome"]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.