framework - modificar cadena de conexion en tiempo de ejecucion c#
¿Es posible cambiar el archivo de configuración de la aplicación en tiempo de ejecución para la aplicación.NET? (4)
Por defecto, el archivo de configuración de la aplicación .NET lleva el nombre de "exe file name" .config. Me pregunto si es posible tener la configuración de una aplicación especificada dinámicamente.
Por ejemplo, la aplicación construida es "foo.exe". En tiempo de ejecución, el archivo de configuración es "foo.exe.config". ¿Es posible que acepte argumentos de línea de comando para usar otro archivo de configuración? Entonces, la aplicación puede usar otra configuración como la siguiente.
foo.exe /config:bar.config
bar.config se usa como archivo de configuración insteand de foo.exe.config.
Código de MSDN
static void DisplayMappedExeConfigurationFileSections()
{
// Get the application configuration file path.
string exeFilePath = System.IO.Path.Combine(
Environment.CurrentDirectory, "ConfigurationManager.exe.config");
// HERE !!!
// Map to the application configuration file.
ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = exeFilePath;
Configuration config =
ConfigurationManager.OpenMappedExeConfiguration(configFile,
ConfigurationUserLevel.None);
// Display the configuration file sections.
ConfigurationSectionCollection sections = config.Sections;
Console.WriteLine();
Console.WriteLine("Sections in machine.config:");
// Loop to get the sections machine.config.
foreach (ConfigurationSection section in sections)
{
string name = section.SectionInformation.Name;
Console.WriteLine("Name: {0}", name);
}
}
Obtenido de Cómo usar Configuration.GetSection () y ConfigurationManager.OpenMappedExeConfiguration ()
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @"C:/Inetpub/Test/Config/Dev.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
AppSettingsSection section = (AppSettingsSection)config.GetSection("appSettings");
string ConfigVersion = section.Settings["ConfigVersion"].Value;
Sí, necesitará usar ExeConfigurationFileMap
Todo lo anterior funciona bien si necesita reemplazar solo la sección AppSettings.
En caso de que tenga que ejecutar con diferentes archivos de configuración (todas las secciones), puede considerar iniciar la aplicación usando un host, que crea el dominio de aplicación para su aplicación principal y establece diferentes archivos de configuración según los parámetros que pasó.
Aquí está el código que funcionó para mí:
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = "file://" + System.Environment.CurrentDirectory;
setup.DisallowBindingRedirects = true;
setup.DisallowCodeDownload = true;
if (args.Length != 0 && args[0].Equals("-test"))
{
setup.ConfigurationFile = "PATH_TO_YOUR_TEST_CONFIG_FILE";
}
else {
setup.ConfigurationFile = "PATH_TO_YOUR_LIVE_CONFIG_FILE";
}
AppDomain domain = AppDomain.CreateDomain("FRIENDLY_NAME", null, setup);
domain.ExecuteAssembly("YourMainApp.exe");