domingo, 31 de julio de 2011

Archivos de Configuración - Una introducción (1/3)

 

Introducción


Es muy común tener que definir parámetros en las aplicaciones que se desarrollan proporcionando cierta configuración que si bien se podría considerar casi estática (porque no cambia constantemente), si sea necesario prever la posibilidad de adaptación.

Un ejemplo muy claro de estos es la cadena de conexión a la base de datos, por lo general una vez instalada la aplicación no cambia, pero cuando se esta en la etapa de implementación seguramente sea necesario su adaptación al entorno.

Por lo general se busca que sea un lugar que impacte lo menos posible en el desarrollo, algunos tienden a crear una clase y colocar constantes o variables readonly dentro del propio código, pero el problema con esto es que requieren recompilar por completo el desarrollo, además de tener que actualizar cada cliente por un simple cambio de configuración.

También se busca un lugar estándar y conocido, algunos usan la registry de windows para definir configuración, quizás era una opción se algo mas viable cuando se contaba con Win XP, pero con Sistemas Operativos como ser Vista o Win 7 esto cambio bastante, el modelo de seguridad que estos imponen aplica restricciones a estas acciones, no haciendo tan cómoda la escritura en este sitio.

Entonces porque no usar la propuesta que hace .net al respecto, si se trata de los archivos de configuración, entre las ventajas que este presenta se pueden encontrar:

  • una lectura simple, ya que se basa en xml
  • fácil acceso y modificación (se puede editar con el notepad), por lo general este archivo se encuentra junto a la aplicación por lo que la seguridad debería permitir la escritura en esta carpeta

Entre los temas que se trataran en este articulo

1- Agregar un archivo de configuración a nuestro proyecto

2- Definir una sección key-value

2a- usando la sección appSettings

2b- definiendo una sección propia

 

1- Agregar un archivo de configuración a nuestro proyecto


Si bien es una acción sencilla, si recién se esta introduciendo en el desarrollo, puede que no resulte tan intuitivo encontrar los pasos para agregar un archivo de configuración.

Estando sobre el proyecto en el “Solution Explorer”, se acciona el menú que aparece con el boton derecho del mouse, seleccionado el menu Add –> New Item…

image

en el recuadro se seleccionara la opción:

image

Esto agregar un archivo de nombre App.config, que en una primer instancia tendrá solo un tag.

Empecemos por una tarea simple, la lectura de una cadena de conexión.

Para lograr esta tarea se necesitara la ayuda de una clase en particular, me refiero al 

ConfigurationManager

con esta clase tendremos acceso a los tag de información definidos, pero para hacer uso de la misma se requiere hacer referencia a la librería System.Configuration, los pasos para esta acción serian representados en la siguiente imagen:

image

Solo queda agregar el código que tomaría la información del archivo de configuración, usándolo luego con los objetos de ado.net para conectarse

image

En el punto 1 se define el “using” a la librería referenciada en el paso anterior (definiendo así su namespace), mientras que en el 2 se hace uso de la clase ConfigurationManager para tomar la cadena de conexión.

Por supuesto en el archivo de configuración se debió agregar la key que se define en el .config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="default" connectionString="Data Source=LecturaConnectionString\TestDb.sdf;Persist Security Info=False;"/>
  </connectionStrings>
</configuration>

2- Definir una sección key-value


Definir información del tipo key-value en el archivo de configuración puede realizarse de varias formas

  • usando la sección appsetting
  • por medio de una seccion custom creada por uno

 

2a- Usando AppSetting

Esta es la forma más simple y directa de definir valores simples en la configuración, solo basta con ingresar en la sección <appSettings> el tag “add” con cada item que se requiera.

En el ejemplo se observará la sección definida como:

<appSettings>
  <add key="1" value="Efectivo" />
  <add key="2" value="Tarjeta Credito" />
  <add key="3" value="Tarjeta Debito" />
  <add key="4" value="Cheque" />
  <add key="5" value="Transferencia Bancaria" />
</appSettings>

En el código, en el Form2, se trabaja con esta información con al ayuda de linq para cargar un combo

private void Form2_Load(object sender, EventArgs e)
{


    var result = (from configKey in ConfigurationManager.AppSettings.Keys.Cast<string>()
                  let configValue = ConfigurationManager.AppSettings[configKey]
                  select new
                  {
                      key = configKey,
                      value = configValue
                  }).ToList();

    
    cmbMediosPago.DisplayMember = "value";
    cmbMediosPago.ValueMember = "key";
    cmbMediosPago.DataSource = result;
    
}

Acceder a un ítem en concreto es tan simple como usar

ConfigurationManager.AppSettings[key]

 

private void cmbMediosPago_SelectionChangeCommitted(object sender, EventArgs e)
{
    string key = Convert.ToString(cmbMediosPago.SelectedValue);
    string value = ConfigurationManager.AppSettings[key];

    lblSeleccion.Text = string.Format("Se ha seleccionado\n Key:{0} \n Value:{1}", key, value);
}

2b- Definiendo una sección propia

El uso de la sección <appSettings> en algunas circunstancia puede resultar demasiado genérico y no brindar un lugar que sea claramente identificable para el negocio que se esta programando, esta sección al ser tan común se puede llenar rápidamente de items key-value no relacionados, haciendo difícil el mantenimiento.

Pero existe una alternativa a este problema y consiste en crear una sección propia para conserva estos pares key-value de forma personalizada, otorgando una visibilidad con sentido para la aplicación

En el código del Form3 se implementa la solución usando una sección definida por uno mismo, la cual aplica el mismo concepto key-value.

<configuration>
  <configSections>
    <section name="MediosPago" type="System.Configuration.DictionarySectionHandler" />
  </configSections>
  
  
  <MediosPago>
    <add key="1" value="Efectivo" />
    <add key="2" value="Tarjeta Credito" />
    <add key="3" value="Tarjeta Debito" />
    <add key="4" value="Cheque" />
    <add key="5" value="Transferencia Bancaria" />
  </MediosPago>
  
</configuration>

Para recuperar la información y listarla

private void Form3_Load(object sender, EventArgs e)
{

    var result = (from config in ((Hashtable)ConfigurationManager.GetSection("MediosPago")).Cast<DictionaryEntry>()
                 select new 
                 {
                     key = config.Key,
                     value = config.Value
                 }).ToList();

    cmbMediosPago.DisplayMember = "value";
    cmbMediosPago.ValueMember = "key";
    cmbMediosPago.DataSource = result;

    cmbMediosPago.SelectedIndex = -1;

}

Obtener un ítem basándonos en la key requiere recuperar la sección completa para luego si acceder al valor

private void cmbMediosPago_SelectionChangeCommitted(object sender, EventArgs e)
{
    string key = Convert.ToString(cmbMediosPago.SelectedValue);
    string value = ((Hashtable)ConfigurationManager.GetSection("MediosPago"))[key].ToString();

    lblSeleccion.Text = string.Format("Se ha seleccionado\n Key:{0} \n Value:{1}", key, value);
}

Por supuesto tanto en estos ejemplo hacer uso de las clase de configuración para tomar el valor del ítem seleccionado, no tiene un sentido practico, ya que el propio combobox proporciona ambos datos key y value (usando el SelectedValue y SelectedText), solo se realiza con fines ilustrativos para poder aplicar los conceptos de programación con el archivo de configuración.

 

Código de ejemplo


[C#] 
[VB.NET] 

92 comentarios:

  1. Hola Leandro, primero que nada agradecerte tu gran trabajo, he aprendido muchísimo gracias a tus artículos.

    Ahora solo para molestarte si pudieras arreglar las ligas de las imágenes... Este tema me interesa mucho y como que si faltan las imágenes para saber de que estas hablando. Salu2

    ResponderEliminar
  2. hola Ulises

    espero lo mas pronto que pueda solucionar el problema que tengo con el hosting

    mientras tanto si necesitas ver las las imagenes y archivos reemplaza el dominio ltuttini.com.ar por http://200.58.122.109/ltuttini.com.ar

    por ejemplo, una de las imagenes dice:
    http://www.ltuttini.com.ar/blogfiles/WinForms/ConfigSeccionesPropias/Parte1/imagen1.jpg

    con el cambio quedaria:
    http://200.58.122.109/ltuttini.com.ar/blogfiles/WinForms/ConfigSeccionesPropias/Parte1/imagen1.jpg


    este problema es temporal, por eso no actualizo el articulo

    saludos

    ResponderEliminar
  3. Mil gracias!! ahora si ya entendí todo :-D

    ResponderEliminar
  4. Saludos leandro,

    es muy buena la utilidad de este proceso, pero al momento de ejecutar la aplicación y cambiar los valores de la configuración, no carga los valores actualizado, a que se debera?

    ResponderEliminar
  5. hola Unknown

    no se si entendi del todo

    al cambiar los valores en que momento ? porque si es desde codigo recuerda que debes realizar un Refresh de la seccion de configuracion para que la tome

    saludos

    ResponderEliminar
  6. Hola Leandro me intereso ese ejemplo. Pero tengo una duda si utilizo ya sea el appsetting o conexion string se puede modificar cuando la aplicacion se este ejecutando? He podido modificarlo pero me obliga a salir y volver a entrar al sistema para que se refleje el cambio. Saludos

    ResponderEliminar
  7. hola Josengan

    por lo general no se recomiendo cambiar informacion de configuracion mientras la aplciacion se ejecuta

    pero si tienes un .exe ejecutandose y editas el .config al realziar la lectura con el ConfigurationManager deberia tomar el cambio

    sino habria que evaluar de usar

    ConfigurationManager.RefreshSection

    saludos

    ResponderEliminar
  8. Hola Leandro, por favor ayudame:

    Realizé un proyecto en 3 capas, siguiendo tambien tu tutorial e inclui un archivo app.config para los connectionstring, me funciona a la perfeccion..
    Ahora necesito tener un instalador de la aplicacion, y surge el siguiente problema:

    Estoy utilizando visual studio para hacer este instalador: arrastro el hasta el proyecto de instalacion archivo.exe(ejecutable) de mi proyecto y este como esta referenciado por defecto me carga las dll de las capas de datos y negocio... pero el archivo app.config no se agrega automaticamente, yo lo agrego como un archivo.... compilo el proyecto de instalacion, instalo mi aplicacion sobre el Sistema Operativo, al momento de ejecutar la aplicacion desde el SO como un programa independiente no se lee el app.config....
    Estoy utilizando .Net Framework 4.

    Insisto mientras estoy desarrollando, la utilizacion del .config va de maravilla, pero cuando llega la hora de instalar la aplicacion llega el problema...

    Como resuelvo esto..???
    Muchas gracias...
    Espero tu pronta respuesta....

    ResponderEliminar
  9. hola GABRIEL

    el tema es que si lo arrastras como archivo este toma el nombre de App.config, cuando deberia tomar el NombreAplicacion.exe.config

    o sea se renombra, esto lo puedes validar en el bin\Debug

    lo raro es que en el instalador no incluya de forma automatico el config, hasta donde se deberia incluirlo dentro de la opcion de primary output

    saludos

    ResponderEliminar
  10. Hola Leandro, disculpa, tengo la necesidad de hacer exactamente lo mismo pero en asp.net con visual

    estoy utilizando visual studio 2010 y esque quiero optimizar mi codigo porque cada webform tengo una cadena de conexión me podrias recomendar como configurarlo para tnerlo ubicado en un solo lado .. de ante mano muchas gracias

    ResponderEliminar
  11. hola Valex

    aplica de la misma forma, el ConfigurationManager lo puedes usar tambien en un entorno web

    quizas la diferencia este en el uso del web.config en lugar del app.config

    saludos

    ResponderEliminar
  12. Hola leandro... fijate que tengo un problema como el que mencionas. sucede que tengo que cambiar mi base de datos de servidor, tenia mi cadena de conexion en una clase, pero ahora tengo que dejarla de manera que al volver a cambiar de servidor o algo asi no tener que volver a programar, se puede hacer con los archivos de configuracion? pero que parametros deberia de declarar y como usarlos despues? gracias.

    ResponderEliminar
  13. por cierto estoy trabajando con vb.net 2008 y sql 2005

    ResponderEliminar
  14. hola Samanta

    si por medio del app.config puede definir la informacion de conexion a la base de datos, como planteo en a primer parte del articulo
    lo escrito en el config se puede editar luego con el notepad sin necesidad de volver a compilar si requieres cambiarlo

    para acceder a la info usarias el ConfigurationManager

    saludos

    ResponderEliminar
  15. entonces esta opcion en el app.config es mas viable que la de usar un dsn de los registros de windows??es que comenzando a entender el funcionamiento de estas.

    ResponderEliminar
  16. y otra consulta.. el archivo que se va a modificar en el block de notas, lo hago antes o despues de crear el ejecutable, y es el que encuentro a en bin/debug ? la verdad es primera vez que haria esto , por eso tantas preguntas. gracias por tu atencion.

    ResponderEliminar
  17. De cualquiera de las 2 maneras que lo haga igual tendria que volver a instalar la aplicacion en las maquinas que la usan?

    ResponderEliminar
  18. hola Samanta

    usar el config es mas flexible que definirlo en cualquier otro lugar

    el archivo de configuracion que defines como app.config se copia al bin\Debug con el nombre NombreApp.exe.config, y debes llevar este junto al .exe

    si lo vas a actualizar puedes hacerlo directo en la pc del usuario sin necesidad de volver a copiar todo, o instalar

    es solo un archivo xml que editas cuando quieres cambiar algo

    saludos

    ResponderEliminar
  19. Hola leandro gracias por todos tus aportes son buenazos.. puedes ayudarme quiero capturar el valor de la cadena de conexion desde una tabla en mi base de datos y quiero asignarla a mi llave en el appconfig... me podrias ayudar

    ResponderEliminar
  20. hola Unknown

    pero eso no seria contradictorio, o sea si debes recuperar la cadena de conexion de la db como sabes como conectarte a esta ?
    o la ides es tener dos bases de datos
    una db de configuracion y otra a la cual te conectarias

    puedes modificar desde codigo el config

    http://social.msdn.microsoft.com/Forums/es-ES/20a0f0aa-884d-4579-939c-43ca985c91db/cambiar-valores-a-appconfig-desde-un-form

    saludos

    ResponderEliminar
  21. claro leandro pero esta cadena que quiero extraer me la va a dar un servicio web que me dara a que servidor deseo entrar es por eso que quiero configurar de esa manera ya que utilizo clic once y la cadena de conexion esta expuesta la idea es que un servicio me de la cadena para acceder a mi sistema ya que en ese servicio la cadena esta oculta en el servidor.. podrias ayudarme saludos

    ResponderEliminar
  22. hola Unknown

    podrias recuperar la cadena de conexion desde el servicio y modificar la config para poner ese valor que recibas

    el config se puede grabar desde codigo

    saludos

    ResponderEliminar
  23. Gracias por tu comentario leandro exelente solucion ya la concrete la solucion que me diste ... Una consulta sobre lector de huellas con vb.net podrias guiarme como realizar uno para solucionar acceso a sistemas... debo leer el acceso medienate un lector de huellas... tengo este lector de huellas Eikon - lector de huella digital saludos

    ResponderEliminar
  24. hola Unknown

    vas a necesitar de las librerias para poer interactuar con el lector de huellas, por lo general el fabricante las proporciona, podrias consultarle

    tambien podrias ver si algun SDK existente tiene compatibilidad con el lector

    cuando tengas las librerias solo sera cuestion de referenciarlas en tu codigo y usar su funcionalidad para interactuar con el hard del lector

    saludos

    ResponderEliminar
  25. Leandro, me parece excelente el post, felicidades, tengo un problema, al trasladar mi .exe junto con el app.config que me genera el compilado y cambio su configuracion para probar, no lo toma, me podrias ayudar en esto? Agradecido

    ResponderEliminar
  26. hola Jesus

    recuerda que el app.config directamente con ese nombre no es reconocido, sino que deberia ser

    NombreAplicacion.exe.config

    si vas a la carpeta \bin\Debug veras alli el .exe y junto a este el config con este formato, cuando lo lleves a otra pc debes ponerlo de esa misma forma

    saludos

    ResponderEliminar
  27. hola leandro una ayuda como puedo agregarle una nueva cadena de conexion a mi app.config que se creee por medio de un formulario.

    ResponderEliminar
  28. hola jose

    simplemente agrega un nuevo tag <add> dentro del <connectionStrings>

    por supuesto la key deberia llevar otro nombre, puedes definir varios connection string

    saludos

    ResponderEliminar
  29. En mi caso, querría poder iniciar la aplicación seleccionando un fichero de configuración. ¿podría indicar cualquier nombre de fichero de configuración? EJ:
    MiApp.exe.config
    OtroparaMiApp.exe.config

    ResponderEliminar
  30. hola Unknown

    podrias usar el

    ConfigurationManager.OpenExeConfiguration Method (String)

    para poder leer la config de otra aplicacion y trabajarla

    saludos

    ResponderEliminar
  31. Hola Leandro, Gracias por responder, tiene la configuracion de nombres como me indicas y nada, estoy haciendo algo mal y no se que es, no me toma los parametros, es como si estuviera tomando los valores que se impusieron cuando se compilo, mi compilacion es a nivel de Release, no lo hice en modo Debug, tiene algo que ver eso? Gracias por tu atención y disculpa tanta molestia, un abrazo

    ResponderEliminar
  32. hola Jesus

    validaste qne en la carpeta \bin\Release este el .exe y el .config ?

    que pasa si intentas ejecutas en modo Debug, funciona ? solo para descartar que sea el modo el que causa el problema

    saludos

    ResponderEliminar
  33. Hola Leandro:

    tengo un problema cuando coloco
    String coneccion = ConfigurationManager.ConnectionStrings["default"].ConnectionString;

    en ejecucion me salta el error

    {"Referencia a objeto no establecida como instancia de un objeto."}

    no entiendo ya que la clase ConfigurationManager es estatica

    muchas gracias

    ResponderEliminar
  34. hola nicovm

    ese erro se produce cuando el ConfigurationManager no puede encontrar la key que indicas en el config

    no es la clase ConfigurationManager la que lanza el error por no instanciarla, sino porque no encuantra la key en el config

    el proyecto que defines como inicio para ejecutar, es alli donde defines el app.config ?


    saludos

    ResponderEliminar
  35. Hola!

    Primero que nada excelente el aporte que haces!

    Mi inquietud es que si para los reportes (Crystal Reports for VS 2010) también puedo usar un archivo de configuración para conectarme a la base de datos???, y así poder hacer mi aplicación mas portable y no tener que estar compilando el código, cuando tenga que cambiar de base de datos.

    ResponderEliminar
  36. hola isiliun

    la verdad no aconsejaria conectar un reporte de Crystal directo a la db, sino que usarias dataset tipados o colecciones, estas las cargaria usando ado.net y luego las asignaria como ReportSource al reporte

    se puede cambiar la conexion del reporte si es que lo conectas directo, pero no es algo que crystal lo realice automatico, sino que desde codigo deberias cambiarlo

    Agregar el código de conexión del informe

    saludos

    ResponderEliminar
  37. HOla leandro, bien tengo pregunta yo estoy realizando una aplicacion en asp.net en la cual en una biblioteca de clases estan mis dbml en la misma se crea un app.config con las cadenas de conexion de la base. pues bien al publicar mi aplicacion se genera un ddl de esa biblioteca de clases la cual por referencia utiliza mi aplicacion web, pero no se como puedo hacer que mis dbml tome las cadenas de mi webconfig y no del app.config de antemano gracias por tu repuesta espero me puedas ayudar.

    ResponderEliminar
  38. hola Paul


    si estas en un entorno web no va ningun app.config porque no te lo va a reconocer

    deberias volcar las secciones de configuracion en el web.config es el unico valido para tener la config del sitio

    para que la tome del web.config solo definela dentro de este y listo, deberia tomarla de forma automatica

    saludos

    ResponderEliminar
  39. Excelente tu post, muchas gracias!

    Una duda, una vez que se hace un publish de la aplicación y esta es instalada es posible modificar los datos que se guardan en el xml y que la aplicación los lea?

    Saludos!

    ResponderEliminar
  40. hola xosel

    claro esa es la idea
    una vez publicado puedes ir con el notepad y cambiar los datos del xml de config
    el config en definitiva es un archivo de texto con xml

    saludos

    ResponderEliminar
  41. Hola Leandro en este articulo nos enseñas como leer una seccion personalizada ¿hay forma de modificar los datos de esa seccion?

    ResponderEliminar
  42. hola Rocio

    si se puede cambiar desde codigo

    App.Config Dinamico

    saludos

    ResponderEliminar
  43. ¡Buen día, Amigo Leandro Tuttini!;

    Interesante tus artículos, sobretodo este que vine de referencia desde el MSDN.

    Soy usuario de allá, y buscando algo referente a cadenas de conexión, en cuanto a mejores prácticas y uso dentro del App se refiere, salí de dudas con este excelente artículo.

    Pero (como siempre) uno a veces lo acompañan más dudas y unas de ellas son ilustradas a continuación:

    Pasa es que en mi AppDesktop siempre llamo a SELECT's y/o StoredProcedure's, y tengo que estar colocando la cadena de conexión. Es decir, siempre conectando a la DB con credenciales y luego la consulta.

    En esos casos, no es necesario el "Open()". (o no lo he requerido).

    Esto comúnmente (o por lo que abarca mi conocimiento) requiere un pequeño lapso de tiempo.

    ¿Es necesario mantener una conexión abierta al abrir la App?

    ¿Cuál es la forma más óptima que las consultas a SQL tarde lo mínimo en establecerse e ir directo al procedimiento?

    Tengo consultas optimizadas, y desde el Management de SQL Server lo he comprobado (no duran más de 1 seg.).

    Agradecido estaría de tu comprensión y respuesta ofrecida.

    Ten feliz día.

    Agradecido.

    ResponderEliminar
  44. Y una última consulta basado en seguridad.

    Me gusta la opción de llevar mi configuración por el XML por que lo noto mucho más limpio, separado y dinámico.

    Ahora ¿Cuál sería la mejor forma de administrar el usuario y contraseña en la conexión? Dado que el .XML puede ser editado o visualizado ¿No?

    ¿En que lugar o como podría cifrar dichos parámetros para la vista del usuario?

    Un saludo amigo.

    ResponderEliminar
  45. hola José

    se puede encriptar una seccion del config para que no pueda ser vista

    Encrypting and Decrypting Configuration Sections


    saludos

    ResponderEliminar
    Respuestas
    1. Hola Leandro:
      Muchas gracias por la información, pero tengo un par de dudas, ojalá puedas ayudarme con esto:

      1) Un app.config (no un web.config usando IIS) puede ser encriptado/desencriptado sin necesidad de usar IIS?, o sea, la clave "server='abc';uid=sa;password=123" podría quedar "...password=xAS!"#sASD" ???

      2) Me urge leer el app.config de otro proyecto, ambos estan en la misma carpeta, pero a pesar que uso el open no me permite, me sale error de acceso y ambos existen, pero parece ser un tema de seguridad, lo otro es que uso EF6 y la cadena no es como una de ADO sino que le agrega metadata y complica la cosa como para sacar el username y database, servername.

      Gracias

      Eliminar
    2. hola

      Para encriptar el app.config se utiliza el mismo comando de asp.net, o sea el aspnet_regiis.exe, esto si quieres realizarlo desde linea de comando, porque tambien se podria realizar usando codigo

      Encrypting App.config For Multiple Machines

      Para leer otro .config entiendo deberia accederse usando ConfigurationManager.OpenExeConfiguration()

      Using External Configuration Files in .NET Applications (C#)


      saludos

      Eliminar
  46. Agradecido, amigo Leandro por la documentación. Excelente entonces para la seguridad cuando es necesaria.

    Y ya me leí algo con el PoolConnection más referente arriba, y documentándome, lo estaba realizando de igual modo, pero desde el AppConfig lo noté más óptimo y seguro.

    Ten feliz día.

    Saludos.

    ResponderEliminar
  47. Hola Leandro, seguro yo puedo crear varios archivos de configuracion en un mismo proyecto, sin embargo estyo ya algunos días intentado resolver el problema pero al parecer la invocacion a los archivos de configuracion externo no logran inicializar las secciones y la aplicacion no levanta, me puedes orientar con un ejemplo por favor.

    ResponderEliminar
  48. hola Santiago

    no importa cuantos archivos de configuracion definas en lso distintos proyectos cuando ejecutes solo tomara uno solo que corresponde al proyecto que inicia

    si es un desarrollo winforms entonces sera este quien tiene que tener todas las secciones de configuracion que requieran ese y los demas proyectos

    saludos

    ResponderEliminar
  49. Gracias, entenídí y por fin logre hacer lo que deseaba. saludos

    ResponderEliminar
  50. Como puedo leer los valores si cambié de nombre al App.config???

    ResponderEliminar
  51. hola Jaime

    y porque has cambiado el nombre al App.config ?
    recuerda que este cuando compila ya cambia de nombre siendo (lo puedes ver en el \bin\Debug)

    NombreProyecto.exe.config

    porque necesitarias cambiarlo de con otro nombre

    saludos

    ResponderEliminar
  52. Hola Leandro, excelente post, pero tengo una duda, tengo varios servicios de windows que se conectan a una base de datos en SLQ Server, cada servicio tiene su respectivo app.config con la connection string y hasta ahi todo funciona perfecto, mi duda es ya que la base de datos es la misma y los servicios se encuentran en la misma ruta, es posible que estos se conecten a un solo app.config ? me refiero a que en lugar de que yo tenga muchos archivos de configuracion (servicio1.exe.config, servicio2.exe.config, servicion.exe.config.... ) tuviera solo uno para todos los servicios, pues cuando tenemos que migrar base de datos, es tedioso andas modificando archivo por archivo, es posible hacer esto?

    ResponderEliminar
  53. hola Ignacio

    hasta donde se, no se puede, ya que cada config tiene el nombre de la aplicaicon con la cual se relaciona
    bueno podrias cargar el config mediante codigo, pero ya no seria automatico como reconce la configuracion

    me parecio ver en algun momento que habia un atributo que permitia definir una seccion en un archivo separado, pero no estoy seguro si se pueda con el connection string

    saludos

    ResponderEliminar
  54. Hola leandro quisiera saber como configurar el appconfig para poder conectar dos proyectos de consola para transformarlo en uno solo ya que los dos interactuan ,como debo hacerlo ayudame porfavor

    ResponderEliminar
  55. hola SEBAXD

    pero si cada proyecto de consola compila en su propio .exe, entonces cada uno tendra su propio archivos de configuracion

    salvo que uno de ellos use el

    ConfigurationManager.OpenExeConfiguration Method (String)

    para tomar el config en base al nombre del otro .exe, pero no se si eso es lo que buscas

    saludos

    ResponderEliminar
  56. Hola leandro, tengo una aplicación de escritorio diseñada con c# y linq to sql, como puedo modificar la cadena de conexión del archivo .dbml, esto x si una máquina cliente intenta conectarse com la maquina servidora

    ResponderEliminar
  57. hola Aquiles

    hasta donde se el dbml define una entrada en el config con la cadena de conexion

    How to change connection string of a dbml file ( LINQ 2 SQL ) dynamically using app.config

    aunque por lo que veo no es tan directo
    saludos

    ResponderEliminar
  58. Hola leandro, muy buena la información, tengo el siguiente problema, una parte de mi codigo se conecta mediante Linq y Entity Framework, mientras que otra parte se conecta con sql, es decir sqlconnection, sql.command, sql.DataReader, etc. (SqlConnection hace referencia a SqlConnection(Properties.Settings.Default.Settings1)) ahora a la hora de modificar el App.Config logro modificar solo lo referido a Linq pero lo demas no logro modificarlo. Sabras en que estoy fallando? debo utilizar completamente Linq. (ya que asi lo plantee en el codigo?)... espero me haya explicado bien y puedas ayudarme, saludos

    ResponderEliminar
  59. Ya esta solucionado, lo que hice fue justamente utilizar todo Linq to Entity Framework y alli la solución, es que desde un comienzo no sabia aplicar Procedimiento almacenado con Entity Framework, investigue, lo aplique y listo. Solucionado. Saludos

    ResponderEliminar
  60. Hola, excelente explicación Leandro, estoy tratando de modificar los valores del archivo de configuración por código pero no lo consigo, podrías complementar tu ejemplo incluyendo el código para actualizar los valores. gracias

    ResponderEliminar
  61. Buenas, tengo una app de configuracion donde tengo una consulta sql que llama unas tablas en sql server, y necesito que me coja ciertos parametros para filtar, que tengo tambien en ese mismo fichero de configuracion como el usuario.¿ Como puedo coger el parametro del usuario y utilizarlo como filtro en la consulta? muchas gracias.

    ResponderEliminar
  62. Buenas tardes Leandro, primero que todo muchas gracias por este aporte, muy interesante. Por otro lado quisiera saber si de pronto sabe como puedo utilizar varios archivos de configuración, es que me interesa sacar los querys o sentencias SQL del código fuente y ponerlos en archivos para su mejor mantenimiento. Agradezco su colaboración y si depronto sabe de algún link donde pueda investigar le agradezco me regale ese dato.

    ResponderEliminar
    Respuestas
    1. hola
      las queries no se definen en los archivos de configuracion, si quieres sacarlas para un mejor rendimiento imagino buscas utilizas Store Procedure
      No se que base de datos usas, pero por ejemplo sql server permite crear procedure para definir alli las queries
      saludos

      Eliminar
  63. Hola leandro, cordial saludos... muy interesante tu aporte pero me gustaría que me ayudaras en como hacer un archivo de configuración de la creación de una base de datos en sql server, es decir que cuando mi aplicación se instale , la base de datos se cree con un archivo .config,.. agradecería tu ayuda.. un abrazo

    ResponderEliminar
    Respuestas
    1. hola
      Me temo que desde un archivo config no vas a poder hacer esto que planteas porque no tienen esa funcionalidad
      En el config puedes definir el conection string de la db a la cual conectarte, pero no crearla
      Para crearla requieres de un script que defina los CREATE DATABASE, o CREATE TABLE, etc
      Un archivo script podria ser un simple acrivo de texto con extension .sql que leas desde codigo y ejecutes
      saludos

      Eliminar
  64. Hola Leandro.

    Tengo una aplicación VB.net 2010. Es un Complemento de Ms Project 2010. Al compilar la aplicación, los parámetros que definí en mi App.config quedan en duro. Cambiar los valores de parámetros en el archivo App.Config, la aplicación no los lee y sigue con los valores que habían al compilar la aplicación. ¿Como leo los valores actualizados del archivo App.Config?.

    En el código fuente esta es la instrucción para leer los párámetros: My.Settings.Mi_Parametro

    EL archivo XML App.Config es el siguiente:































    c:\windows\


    C:\Users\Public


    100


    BAPI_COMPANY_GETLIST


    Z_RFC_GENOPER_SAPPM_MSPROJECT


    100


    C:\Users\Public


    Diagrama de Gan&tt



    ResponderEliminar
    Respuestas
    1. hola
      Quizas debas cerrar la aplicacion y volver a iniciarla cuando cambias un valor del .config
      Tambien podrias intentar usar la clase ConfigurationManager para acceder a los valores de la cofiguracion
      Por otro lado ojo porque si en el Settings defines que el dato del config es del usuario esto haria que el archivo se defina en un lugar diferente en la carpeta del usuario en windows, o sea no es el config que esta junto al .exe
      saludos

      Eliminar
  65. Lo que dice [panadolita] es cierto inicas aplicación con un usuario especifico y no detecta los cambios del *.config. ejecutandolo como administrador recien aplica los cambios al archivo *.config nuevamente lo ejecutas sin elevarlo ahi recien toma los datos. Bueno en lo personal me paso ese caso...
    Existe algun truco sobre esto.

    Gracias.

    ResponderEliminar
    Respuestas
    1. hola
      Pero sobre que carpeta estas ejecutando la aplicacion ? porque si es sobre Programs File puede que el usuario con el cual corres la aplicacion no tenga permisos de escritura, por eso debes ejecutar como admin
      O este problema se presenta cuando ejecutas desde el VS ?
      saludos

      Eliminar
  66. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. hola
      Como un primer comentario podria decirte que el config de las dll no aplica para nada, solo es util el config de la aplicacion que ejecutas, si es winform entonces el config de este proyecto es el que importa.
      Las dll que uses tomaran la configuracion del app.config del proyecto winforms.
      Por otro lado los .config no se empaquetan dentro de ningun archivo, estos siempre estan por fuera, si se agregaron dentro de una dll es porque alguna configuracion de la propiedad del archivos se ha cambiado, se podria revisar si se cambio el Build Action de este app.config para que se embebiera en la dll
      saludos

      Eliminar
  67. hola, mi problema lo he visto en varios comentarios. estoy trabajando un programa en C# y tengo dos proyectos, en uno tengo todas las clases que controlan el acceso, envio y recepcion de informacion al servidor. Necesito un archivo App.Config, claramente debo crearlo en el mismo proyecto donde hago toda la gestión a la BD. se supone que la particularidad del archivo es poder modificarlo luego, es flexible, pero, si compilo, el segundo proyecto que tengo de presentacion donde solo tengo los formularios y envio la informacion al proyecto de Gestión de base de datos solo importará la dll de todo el proyecto de gestión como tal, y el App.Config pierde su "Flexibilidad".

    entonces, mi punto es, qué solución hay a esto, según tu experiencia. por que de no tenerla no habria ningun sentido, ya que me obliga a tener todo dentro de un proyecto y perderia escalabilidad.

    gracias de antemano

    ResponderEliminar
    Respuestas
    1. hola
      La verdad es que no hay una solucion directa, la secciones de configuracion van siempre en el config del proyecto que ejecuta ya sea web o desktop, las dll toman los datos de ese mismo config.
      Equivalent to 'app.config' for a library (DLL)
      Usando el ConfigurationManager.OpenExeConfiguration se podria indicar la ruta al .config de la dll que quieres trabajar.

      Eliminar
  68. Hola Leandro,
    Es posible cambiar el name de un conection string a un web config de un sitio completo?
    lo intenté y mis Datasets no funcionan ahora, es posible hacer ese cambio?

    ResponderEliminar
  69. Hola Leandro, muchas gracias por todas tus aportaciones.

    Tengo una duda es posible modificar el archivo de configuración desde el programa mismo, te comento la aplicación actualmente trabaja con las BD de desarrollo, pero cuando se libere se pretende que el usuario pueda seleccionar el ambiente que necesite, existe una plataforma para contingencias y la plataforma original o incluso si se migra la información que el usuario pueda capturar el nuevo servidor.

    Gracias por tu apoyo

    ResponderEliminar
    Respuestas
    1. hola
      Es que el archivo de configuracion es basicamente un xml, puedes editar este con el notepad, podria el usuario cambiar alli el ambiente. Igualmente se puede desee codigo cambiar la configuracion
      Cambiar Valores a App.config Desde un Form
      veras como usando el ConfigurationManager.OpenExeConfiguration() abres el config para cambiar el valor
      saludos

      Eliminar
    2. Muchas gracias, otra duda, en la carpeta donde se instala el paquete el usuario no tiene privilegios para modificar , es posible colocar el app.config en otra carpeta y que la aplicación lo pueda acceder

      Eliminar
    3. hola
      Si ese es un tema, la verdad no lo veo tan simple. Quizas podrias poner el codigo que cambia el config ejecutando con provilegios de admin
      How to force my project in Visual Studio 2013 to always run as Administrator?
      como veras se define un archivo de manifest donde puedes indicar que la aplicacion eejcuta como admin, de esta forma podrias cambiar desde codigo el .config
      saludos

      Eliminar
    4. muchas gracias lo voy a probar

      Eliminar
  70. Hola Leandro:

    Como puedo hacerle en C# para que después de cierto tiempo de inactividad se cierre la aplicación.

    ResponderEliminar
  71. Que tal Leandro, te he seguido en varios temas y en distintas fuentes de información y pues como todos lo saben, haces un grandioso trabajo con tus aportes.

    Ahora viene una duda que tengo respecto a la forma de administrar unas aplicaciones en la empresa donde laboro. Desean que cree un "Repositorio" con dichas aplicaciones y que separe en distintas carpetas los .Config, .Dll y los .exe. Con el tema de las DLL voy bien ya que agregue en el app.config de cada proyecto un par de líenas que vi en un aporte tuyo, pero me viene la duda con los .config ya que hice lo mismo pero los exe no se ejecutan en las maquinas de los demas usuarios. Que me recomiendas para este tema?

    Desde ya agradeciendo tu asesoría.

    Saludos.

    ResponderEliminar
  72. Muchas gracias Leandro, me sirvió para una situación especifica, que buena explicación.

    ResponderEliminar
  73. Hola tengo un problema muy particular, estoy creando una app q debe leer un fichero de configuración .ini pero q se guarda indistintamente en la raíz de la aplicación o se puede guardar en la carpeta de configuración de usuario dependiendo de los permisos del usuario ¿ como puedo saber en cuál ruta está para poder leer el fichero .ini?

    ResponderEliminar
  74. que tal leandro tengo un problema

    tengo un timer















    fecha








    que actuliza el tiempo cada 10 segundos

    'If Not IsPostBack Then
    TextBox2.Text = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")
    'Me.BindGrid1()


    'End If


    v_connectionstring.Open()


    cmd.CommandText = "SELECT max(folioint) FROM incidencias"

    cmd.CommandType = CommandType.Text
    cmd.Connection = v_connectionstring

    reader = cmd.ExecuteReader()
    reader.Read()

    If reader.HasRows Then

    If reader.Item(0) <> lblcom.Text Then

    MsgBox("si entro")
    ClientScript.RegisterStartupScript([GetType](), "hola", "mostrarmodal2()", False)
    ClientScript.RegisterStartupScript([GetType](), "hola", "toast()", False)

    lblcom.Text = reader.Item(0)
    Label36.Text = reader.Item(0)







    End If


    End If
    reader.Close()

    v_connectionstring.Close()
    end sub

    manda el valor a una funcion protected sub pero desde ahi no puedo mandar llamar las funciones de javascript y no se porque espero me pudieras ayudar muchas gracias sistemasgaza@gmail.com

    por favor muchas gracias

    ResponderEliminar
  75. Mil gracias por tus aportaciones... Muy útiles... Saludos y bendiciones

    ResponderEliminar
  76. Hola, no se alguien lo lea...pero tengo una solución con dos proyectos, con su archivo app.config....ambos entran en conflicto y hay problemas, uso entity framework y esta sección da problemas, primero me pide la cadena de conexión en el appconfig del primer proyecto, es un Windows Forms, se la pongo y pide los datos del Entity, se los pongo, pero luego marca conflicto de que:

    ConfigurationErrorsException: Sólo se permite un elemento por archivo de configuración y, si lo hay, debe ser el primer elemento secundario del elemento raíz

    ResponderEliminar
  77. Hola Leandro, ante todo te agradezco enormemente tu tiempo y sabiduría.
    Estoy arrancando con un proyecto que basicamente es un menú desde donde abro diferentes aplicaciones.
    Quiero guardar los Path de las app en el archivo de configuración, pero no puedo hacer funcionar la edición de la app.config. La agregué siguiendo los pasos que indicas, pero no me toma el comando
    Probé tambíen con la personalizada de tu ejemplo de medios de pago, pero tampoco me funciona.
    Agregué la referencia de System.configuración. Debo hacer algo mas?
    Mi codigo es:


















    Muchas gracias!!!!

    ResponderEliminar