7.29.2013

Leer un archivo de configuración de una librería dll – C#

Una pregunta que siempre ronda nuestras labores de desarrolladores es como hago para cargar datos de un archivo config si este archivo esta asociado a un dll y yo estoy invocándolo desde una aplicación que carga su propio archivo config. Para ilustrarlo de mejor manera veamos el siguiente diagrama:

image

En este caso, una aplicación web invoca una librería que para poder acceder un recurso ( una base de datos, servicio WCF, etc ) requiere un dato que esta en un archivo de configuración. En estos casos lo que sucede es que la aplicación web carga su propio archivo config y cuando tratamos de obtener los valores que necesitamos se produce un error indicándonos que no encuentra los valores buscados.

La solución mas común es copiar esas parejas de valores dentro del config de la aplicación web para que estos puedan ser cargados; sin embargo, en muchos casos esta solución no es viable porque se utiliza un archivo distribuido para todas las aplicaciones, con lo cual es mas fácil el mantenimiento, pero un poquito mas complicada la programación.

La solución

Es posible cargar un archivo de configuración que pertenece a otro componente – el tema de si es adecuado o no lo dejamos para otro post -  utilizando la clase ConfigurationManager y una instancia de la clase ExeConfigurationFileMap. El código para cargar un archivo de configuración es el siguiente:

   1:  public  class AdministradorDeConfig

   2:      {

   3:          public string ObtenerValor(string pNombreVariable)

   4:          {

   5:              try

   6:              {

   7:                  var _path = Assembly.GetExecutingAssembly().Location + ".config";

   8:   

   9:                  var _configMap = new ExeConfigurationFileMap

  10:                      {

  11:                          ExeConfigFilename = _path 

  12:                      };

  13:   

  14:                  var _configuracion = ConfigurationManager.OpenMappedExeConfiguration(_configMap, ConfigurationUserLevel.None);

  15:                  var _settings = _configuracion.AppSettings;

  16:   

  17:                  return _settings.Settings[pNombreVariable].Value;

  18:              }

  19:              catch (Exception _e)

  20:              {

  21:                  Console.WriteLine(_e);

  22:                  return string.Empty;

  23:              }

  24:          }

  25:      }



Como podemos ver, obtenemos el nombre del archivo de configuración utilizando Reflection – normalmente los archivos de configuración de las librerias se copian con el siguiente formato –> [Libreria.dll.config]. Luego procedemos a crear una instancia de la clase ExeConfigurationFileMap, la cual nos permite definir una estructura para mapear las configuraciones del archivo para poder cargarlo, en este caso simplemente le asignamos la ruta donde esta el archivo config y su nombre.


Luego procedemos a abrir el archivo de configuración con el método ConfigurationManager.OpenMappedExeConfiguration al cual le pasamos el FileMap y una variable que nos permite definir el nivel del usuario con el archivo por si desea llevar acciones tales como editar exclusivo, etc. Esta variable le asignamos None como configurationUserLevel y procedemos a trabajar con el archivo, que en este caso es solamente ir a traer la variable de la sección AppSettings que nos solicitan vía parámetro.  Las variables disponibles se ven a continuación:


   1:  <?xml version="1.0" encoding="utf-8" ?>

   2:  <configuration>

   3:    <appSettings>

   4:      <add key="Valor1" value="Contenido del valor 1"/>

   5:      <add key="Valor2" value="Contenido del valor 2"/>

   6:    </appSettings>

   7:  </configuration>



En nuestro caso vamos a usar una prueba unitaria para acceder a las variables. El código de la prueba unitaria se ve a continuación:


   1:  [TestClass]

   2:      public class Pruebas_ConfigFiles

   3:      {

   4:          [TestMethod]

   5:          public void SolicitarVariable1_RetornaContenido1()

   6:          {

   7:              var _adminConfig = new AdministradorDeConfig();

   8:   

   9:              var _resultado = _adminConfig.ObtenerValor("Valor1");

  10:   

  11:              Assert.IsTrue( _resultado.Length > 0);

  12:          }

  13:      }






Como podemos ver, cuando ejecutamos la prueba unitaria el resultado es positivo:


image 


Technorati Tags: ,

error X2003: #error: "Errors exist for one or more children." BizTalk Server

Creando un demo para un webcast me dio el siguiente error

Errors exist for one or more children

Este error aparecía en el output de visual studio y si le daba doble clic al error, me llevaba al código XLANG de la orquestación, tal y como se ve en la siguiente figura:

image

El error se da por un trozo de código mal escrito en un “Expression Shape” que sin embargo fue corregido pero por alguna razón el compilador no lograba detectar el cambio; entonces daba el error y no permitía construir la orquestación aunque no decía cual era el mismo.

Para solucionarlo simplemente se borra la línea que contiene el mensaje de error y se procede a recompilar. Con esto ya podemos generar el dll y hacer deployment de la solución.

Technorati Tags: ,,