Tengo el siguiente problema:
tenemos una aplicación que carga módulos (complementos). Es posible que estos módulos necesiten entradas en app.config (por ejemplo, configuración de WCF). Debido a que los módulos se cargan dinámicamente, no quiero tener estas entradas en el archivo app.config de mi aplicación.
Lo que me gustaría hacer es lo siguiente:
- Cree una nueva aplicación.config en memoria que incorpore las secciones de configuración de los módulos
- Dile a mi aplicación que use esa nueva aplicación.
Nota: ¡No quiero sobrescribir la aplicación predeterminada.config!
Debería funcionar de manera transparente, de modo que, por ejemplo ConfigurationManager.AppSettings
use ese nuevo archivo.
Durante mi evaluación de este problema, se me ocurrió la misma solución que se proporciona aquí: Recargar app.config con nunit .
Desafortunadamente, no parece hacer nada, porque todavía obtengo los datos de la app.config normal.
Usé este código para probarlo:
Console.WriteLine(ConfigurationManager.AppSettings["SettingA"]);
Console.WriteLine(Settings.Default.Setting);
var combinedConfig = string.Format(CONFIG2, CONFIG);
var tempFileName = Path.GetTempFileName();
using (var writer = new StreamWriter(tempFileName))
{
writer.Write(combinedConfig);
}
using(AppConfig.Change(tempFileName))
{
Console.WriteLine(ConfigurationManager.AppSettings["SettingA"]);
Console.WriteLine(Settings.Default.Setting);
}
Imprime los mismos valores dos veces, aunque combinedConfig
contiene otros valores distintos de la aplicación.config normal.
fuente
AppDomain
con el archivo de configuración apropiado no es una opción?Reload app.config with nunit
podría funcionar, no estoy seguro, si se usa en la entrada de la aplicación antes de cargar cualquier configuración.Respuestas:
El truco en la pregunta vinculada funciona si se usa antes de que el sistema de configuración se use por primera vez. Después de eso, ya no funciona.
La razón:
existe una clase
ClientConfigPaths
que almacena en caché las rutas. Entonces, incluso después de cambiar la ruta conSetData
, no se vuelve a leer, porque ya existen valores en caché. La solución es eliminar estos también:El uso es así:
Si desea cambiar el archivo app.config usado durante todo el tiempo de ejecución de su aplicación, simplemente colóquelo
AppConfig.Change(tempFileName)
sin usarlo en algún lugar al inicio de su aplicación.fuente
Puede intentar usar Configuración y Agregar Sección de Configuración en tiempo de ejecución
EDITAR: Aquí hay una solución basada en la reflexión (aunque no es muy agradable)
Crear clase derivada de
IInternalConfigSystem
luego, a través de la reflexión, configúrelo en un campo privado en
ConfigurationManager
fuente
file_path
. Esto no hará que la sección esté disponible para los usuarios deConfigurationManager.GetSection
, porqueGetSection
usa la aplicación predeterminada.La solución @Daniel funciona bien. Una solución similar con más explicación está en la esquina c-sharp. Para completar, me gustaría compartir mi versión: con
using
, y las banderas de bits abreviadas.fuente
Si alguien está interesado, aquí hay un método que funciona en Mono.
fuente
La solución de Daniel parece funcionar incluso para los ensambles posteriores que usé anteriormente AppDomain.SetData, pero no sabía cómo restablecer los indicadores de configuración interna
Convertido a C ++ / CLI para aquellos interesados
fuente
Si su archivo de configuración solo está escrito con clave / valores en "appSettings", puede leer otro archivo con dicho código:
Luego puede leer section.Settings como colección de KeyValueConfigurationElement.
fuente
ConfigurationManager.GetSection
leer el nuevo archivo que creé. Tu solución no hace eso.ConfigurationManager.GetSection
utiliza la aplicación predeterminada.config. No le importa el archivo de configuración con el que abrióOpenMappedExeConfiguration
.Maravillosa discusión, he agregado más comentarios al método ResetConfigMechanism para comprender la magia detrás de la declaración / llamadas en el método. También existe verificación de ruta de archivo agregado
fuente
Daniel, si es posible, intenta usar otros mecanismos de configuración. Hemos pasado por esta ruta donde teníamos diferentes archivos de configuración estáticos / dinámicos dependiendo del entorno / perfil / grupo y al final se volvió bastante desordenado.
podría probar algún tipo de servicio web de perfil en el que solo especifique una URL de servicio web del cliente y, según los detalles del cliente (puede tener anulaciones de nivel de grupo / usuario), carga toda la configuración que necesita. También hemos usado MS Enterprise Library para alguna parte de ella.
es decir, no implementa la configuración con su cliente y puede administrarla por separado de sus clientes
fuente