AppSettings obtiene valor del archivo .config

172

No puedo acceder a los valores en el archivo de configuración.

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

archivo .config :

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

¿Tienes alguna sugerencia de qué debo hacer?

Mate
fuente

Respuestas:

345

Esto funciona para mi:

string value = System.Configuration.ConfigurationManager.AppSettings[key];
Adán
fuente
66
El código que proporcioné requiere que el archivo YourProgram.exe.config exista en la misma carpeta que YourProgram.exe. Solo asegúrate de que esté allí. Un error común es copiar el archivo app.config en el directorio de destino, que no funcionará.
Adam
40
Requerir agregar referencia System.Configuration.
suma de comprobación
13
Mi .NET 4.5 System.Configuration no tieneConfigurationManager
qwert_ukg
3
También obtengo un valor nulo en un proyecto 4.5: pasé dos horas en esto ... Tiene que ser un error.
IrishChieftain
1
Yo también estoy viendo esto en una aplicación de múltiples objetivos, mi configuración principal de .net funciona pero la configuración de .net framework no lo hace (usando ConfigurationManager)
Michael Brown
61

La respuesta que dtsg dio funciona:

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

PERO, debe agregar una referencia de ensamblaje a

Configuración del sistema

Vaya a su Explorador de soluciones y haga clic derecho en Referencias y seleccione Agregar referencia . Seleccione la pestaña Ensamblajes y busque Configuración .

Gerente de referencia

Aquí hay un ejemplo de mi 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>

Que puede obtener de la siguiente manera:

string adminName = ConfigurationManager.AppSettings["AdminName"];
rotgers
fuente
2
Parece que tengo el mismo problema que OP. Usando VS2015. No sé cómo ni por qué, pero mi referencia a System.Configuration dice System.configuration (minúsculas).
Tim
Esto podría hacer con la explicación de cubrir donde no hay una pestaña "ensamblados" (al menos VS2019)
Alguien más el
21

Prueba esto:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
dtsg
fuente
44
Su implementación debe ser incorrecta. Esto definitivamente funciona para recuperar valores clave de un archivo de configuración.
dtsg
Asegúrese de agregar una referencia a System.Configuration en las referencias para su proyecto.
GrahamJ
19

Leer de la configuración:

Deberá agregar una referencia a Config

  1. Abra "Propiedades" en su proyecto
  2. Vaya a la pestaña "Configuración"
  3. Agregue "Nombre" y "Valor"
  4. Obtenga valor con el siguiente código:
string value = Properties.Settings.Default.keyname;

Guardar en la configuración:

Properties.Settings.Default.keyName = value;
Properties.Settings.Default.Save();
Masoud Siahkali
fuente
44
Realmente útil ya que todas las otras respuestas que usan ConfigurationManager no funcionan si agrega sus valores en las pestañas de Configuración de las propiedades del proyecto como lo ha descrito. Gracias.
The Dumb Radish
2
Esto funcionó para mí también. Estaba recibiendo una nullcadena con las recomendaciones anteriores, ¡pero Properties.Settings.Default.<keyName>funcionó de maravilla!
dub
1
Perfecto ! Estaba buscando esto :) ¡Gracias!
HSQL
@Masoud Siahkali, la semana pasada probé más o menos lo que tienes aquí en mi propio proyecto, pero los valores, cuando los cambió el usuario en el tiempo de ejecución (solo ejecutándolo desde la GUI de VS por ahora) no persisten en todas las instancias. Mi pregunta: stackoverflow.com/questions/61018443/… . Aún no se han descubierto por qué no persisten configuraciones que cambió el usuario de esos valores ...
Marky
8

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

Donde value1 = ... y value3 = ... da un valor nulo y value2 = ... funciona

Luego decidí reemplazar la app.config interna 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"];

Usando VS2012 .net 4

Kkloe
fuente
Esto es exactamente lo que necesitaba. Realmente útil, gracias.
Umut OVECOGLU
5

En el app/web.configarchivo establezca la siguiente configuración:

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

entonces puede acceder a esto en su código al poner en esta línea:

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

* Tenga en cuenta que esto funciona bien para .net4.5.xy .net4.6.x; pero no trabajas para .net core. Saludos cordiales: Rafael

Rafael Andrs Cspedes Basterio
fuente
3

Volviendo a este después de mucho tiempo ...

Dada la desaparición de ConfigurationManager, para cualquiera que todavía esté buscando una respuesta a este intento (por ejemplo):

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

Requiere Sistema. Configuración por supuesto.

(Editó el código a algo que realmente funciona y es más fácil de leer)

Mike Dean
fuente
Buena respuesta, pero por favor, limpie, ¿por qué crear una nueva instancia de AppSettingsReader cuando vuelve a crear AppSettingsReader nuevamente, y no necesita convertir cadenas, simplemente puede finalizarlo para anular .ToString ()?
maytham-ɯɐɥʇʎɐɯ
2

Mira, hice lo que pensé que era obvio:

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

Si bien eso se compila, siempre devuelve nulo.

Sin embargo, esto (desde arriba) funciona:

string filePath = ConfigurationManager.AppSettings["ClientsFilePath"];
Steve
fuente
2

Algunas de las respuestas parecen un poco fuera de lo normal. Aquí está mi opinión sobre 2016

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

Asegúrese de que System.Configurationesté referenciado.

La pregunta es el valor de una clave de configuración de aplicaciones

Que sin duda DEBERÍA ser

  string yourKeyValue = ConfigurationManager.AppSettings["ClientsFilePath"]

  //yourKeyValue should hold on the HEAP  "filepath"

Aquí hay un giro en el que puede agrupar valores (no para esta pregunta)

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

emails será el valor de la clave de entorno + "_Emails"

example :   jack@google.com;thad@google.com;
Tom Stickel
fuente
2

Para la aplicación web, normalmente escribiré este método y solo lo llamaré con la tecla.

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

Simplemente puede escribir:

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

porque keyes un objeto y AppSettingstoma una cadena

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

O puedes usar

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

//Gets the values associated with the specified key from the System.Collections.Specialized.NameValueCollection
Davit Mikuchadze
fuente
0

Mi prueba simple también falló, siguiendo el consejo de las otras respuestas aquí, hasta que me di cuenta de que el archivo de configuración que agregué a mi aplicación de escritorio recibió el nombre "App1.config". Lo renombré a "App.config" y todo funcionó de inmediato como debería.

BCA
fuente
0
  1. Abra "Propiedades" en su proyecto
  2. Vaya a la pestaña "Configuración"
  3. Agregue "Nombre" y "Valor"

EL CÓDIGO SERÁ GENERADO AUTOMÁTICAMENTE

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

Para obtener un valor

Properties.Settings.Default.Name

O

Properties.Settings.Default ["nombre"]

Hakan
fuente