Configurando Assemblies con Configuration y ConfigurationManager

 

En este post voy a intentar hacer unos ejemplos que resuman la funcionalidad que nos aportan las clases configuration y ConfigurationManager.

 

Tras comprobar que es difícil encontrar un ejemplo sencillo de la utilización de estas clases en la msdn, voy a realizar un ejemplo completo de cómo añadir, eliminar, modificar y listar las claves de un archivo de configuración mediante la utilización de estas clases.

 

Lo primero que tenemos que tener en cuenta es que cuando ejecutemos nuestra aplicación, si lo hacemos desde el visual studio, el archivo de configuración que se crea es temporal (del tipo nombre_assemblie.vshost.exe.config), por lo que para que nuestro config quede persistente e ir comprobando los cambios, lo mejor es generar la aplicación y ejecutarla de manera independiente para ver el fichero de configuración que se genera.

 

Para una mejor compresión el ejemplo va a estar realizado sobre una aplicación de consola en lenguaje c#.

 

Lo primero es crear una aplicación de consola y en el main, agregar el siguiente código. Esto no lo explico ya que como se dice el siguiente código es autoexplicativo 😉

 

 

 

static void Main(string[] args)
       {
              string opcion = "";

              while (opcion.ToLower() != "0")
              {
                  Console.Clear();
                  Console.WriteLine("Opciones");
                  Console.WriteLine("0.- Salir");
                  Console.WriteLine("1.- Leer Todo el AppSettings");
                  Console.WriteLine("2.- Crear una Clave en el  AppSettings");
                  Console.WriteLine("3.- Modificar una Clave en el  AppSettings");
                  Console.WriteLine("4.- Borrar una Clave en el  AppSettings");
                  switch (opcion)
                  {
                      case "1":
                          ConfigTest.ReadAppSettingsAllKeys();
                          break;
                      case "2":
                          ConfigTest.WriteAppSettingsKey();
                          break;
                      case "3":
                          ConfigTest.ModifyAppSettingsKey();
                          break;
                      case "4":
                          ConfigTest.DeleteAppSettingsKey();
                          break;
                  }
                  opcion = Console.ReadLine();
              }        
       }

 

A continuación agregaremos una clase al proyecto, en mi caso la he llamado ConfigTest.cs, sobre esta clase agregaremos la referencia a System.Configuration, ya que es necesaria para poder utilizar los using que necesitamos.

 

Dibujo1

Una vez añadida la referencia incluiremos dos using que vamos a utilizar:

Para recuperar la lista de entradas en el appSetting necesitamos using using System.Collections.Specialized; ya que la lista de entradas se devuelve como una NamedValue Collection.

Para poder acceder a las clases Configuration y ConfigurationManager, debemos incorporar el using System.Configuration;

Una vez que hemos hecho esto crearemos una función para crear, borrar, modificar, listar una entrada y listar todas las entradas.

Los comentarios están en el propio código así que copio toda la clase y luego pongo unas capturas de su utilización.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Collections.Specialized;

namespace TestConfigurationSettings
{
    class ConfigTest
    {
        // Para  lee todas las entradas del appSettings 

        public static void ReadAppSettingsAllKeys()
        {
            try
            {
                Console.Clear();
                Console.WriteLine("Opción 1. Ver las entradas en el AppSetting");

                // Obtenemos la colección de valores de AppSettings
                NameValueCollection appSettings = ConfigurationManager.AppSettings;

                if (appSettings.Count == 0)
                {
                    Console.WriteLine("[ReadAppSettings: {0}]",
                    "AppSettings no tiene Entradas.");
                }
                for (int i = 0; i < appSettings.Count; i++)
                {
                    Console.WriteLine("#{0} Key: {1} Value: {2}",
                      i, appSettings.GetKey(i), appSettings[i]);
                }
            }
            catch (ConfigurationErrorsException e)
            {
                Console.WriteLine("[ReadAppSettingsAllKeys: {0}]",
                    e.ToString());
            }
        }

        //Esta función se utiliza para modificar una clave en el AppSettings
        public static void ModifyAppSettingsKey()
        {
            try
            {
                   //Mostramos las claves actuales
                Console.Clear();
                Console.WriteLine("Opción 3. Modificar una Clave en el AppSetting");
                Console.WriteLine("Estas son las claves actuales:");
                ReadAppSettingsAllKeys(); //llámamos a la función de lectura que hemos creado previamente

                Console.WriteLine("Introduce la clave a modificar:");
                String clave = Console.ReadLine();
                Console.WriteLine("Introduce la clave a modificar:");
                String valor = Console.ReadLine();

              //Ahora modificamos la clave
                //Primero obtenemos el fichero de configuración
                Configuration Config = ConfigurationManager.OpenExeConfiguration
                        (ConfigurationUserLevel.None);

                //Creamos un objeto de tipo AppSettingsSection y le asignamos la sección
                //appSettings de nuestro fichero de configuración
                AppSettingsSection appSection = Config.AppSettings;

                //Por último asignamos el valor y refrescargamos la sección entera para
                //tenerla disponible en el programa
                appSection.Settings[clave].Value = valor;

                Config.Save(ConfigurationSaveMode.Modified);

                ConfigurationManager.RefreshSection("appSettings");

            }
            catch (ConfigurationErrorsException e)
            {
                Console.WriteLine("[ModifyAppSettingsAllKey: {0}]",
                    e.ToString());
            }
        }

       //Esta función se utiliza para crear una clave en el AppSettings
        public static void WriteAppSettingsKey()
        {
            try
            {
                //Primero abrimos el fichero de configuración
                System.Configuration.Configuration config =
                ConfigurationManager.OpenExeConfiguration(
                 ConfigurationUserLevel.None);

                //Pedimos la clave por consola
                Console.Clear();
                Console.WriteLine("Opción 2. Crear una Clave en el AppSetting");

                Console.WriteLine("Introduce la clave para la entrada en el appSetting");
                String Clave = Console.ReadLine();

                //Pedimos el valor por la consola
                Console.WriteLine("Introduce el valor para la entrada en el appSetting");
                String Valor = Console.ReadLine();
                //Ahora agregamos la nueva entrada al fichero de configuración
                config.AppSettings.Settings.Add(Clave, Valor);

                //Después guardamos el fichero
                config.Save(ConfigurationSaveMode.Modified );

                //Una vez que hemos guardado el fichero es necesario
                //Volver a recargar al menos la sección que hemos modificado.
                //De esta forma podremos utilizar los valores desde nuestra aplicación.
                ConfigurationManager.RefreshSection("appSettings");

                AppSettingsSection appSettingSection =
                  (AppSettingsSection)config.GetSection("appSettings");
            }
            catch (ConfigurationErrorsException e)
            {
                Console.WriteLine("[WriteAppSettingsKey: {0}]",
                    e.ToString());
            }

              }
        //Esta función borra una clave del appSettings
        public static void DeleteAppSettingsKey()
        {
            try{
                //Mostramos las claves actuales
                Console.Clear();
                Console.WriteLine("Opción 4. Borrar una Clave en el AppSetting");
                Console.WriteLine("Estas son las claves actuales:");
                ReadAppSettingsAllKeys(); //llámamos a la función de lectura que hemos creado previamente

                Console.WriteLine("Introduce la clave a borrar:");
                String clave = Console.ReadLine();

                //Ahora procedemos a borrar la clave
                Configuration Config = ConfigurationManager.OpenExeConfiguration
                       (ConfigurationUserLevel.None);

                //Creamos un objeto de tipo AppSettingsSection y le asignamos la sección
                //appSettings de nuestro fichero de configuración
                AppSettingsSection appSection = Config.AppSettings;

                //Por último asignamos el valor y refrescargamos la sección entera para
                //tenerla disponible en el programa
                appSection.Settings.Remove(clave);

                //Después guardamos el fichero
                Config.Save(ConfigurationSaveMode.Modified);

                //Una vez que hemos guardado el fichero es necesario
                //Volver a recargar al menos la sección que hemos modificado.
                //De esta forma podremos utilizar los valores desde nuestra aplicación.
                ConfigurationManager.RefreshSection("appSettings");

            }
            catch (ConfigurationErrorsException e)
            {
                Console.WriteLine("[DeleteAppSettingskey: {0}]",
                    e.ToString());
            }

        }
    }
}

 

Para finalizar vamos a ver un ejemplo de su utilización:

Primero tras ver el menú principal, metemos algunas entradas, yo sólo muestro el pantallazo de la primera por legibilidad.

Dibujo2

Con la Opción 2 vamos introduciendo entradas

Dibujo3

Tras haber introducido la primera entrada se habrá generado un fichero, que podemos ver aquí con el mi caso las tres entradas que he creado:

Dibujo4

Así podéis probar todas las opciones, por ejemplo la de listar todas las claves

Dibujo5

Espero que os sirva!!!

5 comentarios en “Configurando Assemblies con Configuration y ConfigurationManager”

  1. si, al modificar el web.config por código, se reinicia la aplicación web, no?

    para un app.config de aplicación Windows, habría que reiniciar el EXE para que aplicase los cambios ??

    salu2

  2. Depende, si son parámetros que utilizas tu en tu programación puedes tenerlos disponibles tras grabarlos, aplicando el código que puedes ver en el ejemplo:

    ConfigurationManager.RefreshSection(“appSettings”);

    Si son parámetros para el framework o el IIS, seguramente tendrás que reiniciar

  3. quiero hacer eso mismo pero pasa que la entrada que pongo no queda guardada en el archivo app.config, cuando arranco de nuevo el programa el archivo esta como si no hubiera hecho nada

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *