No es trivial crear un archivo de configuración .NET para un .DLL, y por una buena razón. El mecanismo de configuración .NET tiene muchas características incorporadas para facilitar la actualización / actualización fácil de la aplicación y para proteger las aplicaciones instaladas de pisotear los archivos de configuración de los demás.
Hay una gran diferencia entre cómo se usa una DLL y cómo se usa una aplicación. Es poco probable que tenga varias copias de una aplicación instalada en la misma máquina para el mismo usuario. Pero es muy posible que tenga 100 aplicaciones o bibliotecas diferentes, todas haciendo uso de alguna DLL de .NET.
Si bien rara vez es necesario rastrear la configuración por separado para diferentes copias de una aplicación dentro de un perfil de usuario, es muy poco probable que desee que todos los diferentes usos de una DLL compartan la configuración entre sí. Por esta razón, cuando recupera un objeto de Configuración utilizando el método "normal", el objeto que recupera está vinculado a la configuración del Dominio de la Aplicación en el que está ejecutando, en lugar del ensamblaje particular.
El dominio de la aplicación está vinculado al ensamblado raíz que cargó el ensamblado en el que se encuentra realmente su código. En la mayoría de los casos, este será el ensamblaje de su .EXE principal, que es lo que cargó el .DLL. Es posible activar otros dominios de aplicación dentro de una aplicación, pero debe proporcionar explícitamente información sobre cuál es el ensamblado raíz de ese dominio de aplicación.
Debido a todo esto, el procedimiento para crear un archivo de configuración específico de la biblioteca no es tan conveniente. Es el mismo proceso que usaría para crear un archivo de configuración portátil arbitrario que no esté vinculado a ningún ensamblado en particular, pero para el que desea utilizar el esquema XML de .NET, la sección de configuración y los mecanismos de los elementos de configuración, etc. Esto implica crear un ExeConfigurationFileMap
objeto , cargando los datos para identificar dónde se almacenará el archivo de configuración y luego llamando ConfigurationManager
. OpenMappedExeConfiguration
para abrirlo en una nueva Configuration
instancia. Esto lo cortará de la protección de versión que ofrece el mecanismo automático de generación de rutas.
Estadísticamente hablando, es probable que esté utilizando esta biblioteca en un entorno interno, y es poco probable que tenga múltiples aplicaciones que la utilicen en una sola máquina / usuario. Pero si no, hay algo que debe tener en cuenta. Si utiliza un único archivo de configuración global para su DLL, independientemente de la aplicación que lo esté haciendo referencia, debe preocuparse por los conflictos de acceso. Si dos aplicaciones que hacen referencia a su biblioteca se ejecutan al mismo tiempo, cada una con su propio Configuration
objeto abierto, cuando una guarde los cambios, causará una excepción la próxima vez que intente recuperar o guardar datos en la otra aplicación.
La forma más segura y sencilla de evitar esto es exigir que el ensamblado que está cargando su DLL también proporcione cierta información sobre sí mismo, o detectarlo examinando el dominio de aplicación del ensamblaje de referencia. Use esto para crear algún tipo de estructura de carpetas para mantener archivos de configuración de usuario separados para cada aplicación que haga referencia a su DLL.
Si está seguro de que desea tener una configuración global para su DLL, sin importar a dónde se haga referencia, deberá determinar su ubicación en lugar de que .NET descubra una adecuada de forma automática. También deberá ser agresivo sobre la administración del acceso al archivo. Necesitará almacenar en caché tanto como sea posible, manteniendo la Configuration
instancia SOLO todo el tiempo necesario para cargar o guardar, abrir inmediatamente antes y desechar inmediatamente después. Y finalmente, necesitará un mecanismo de bloqueo para proteger el archivo mientras está siendo editado por una de las aplicaciones que usan la biblioteca.