working not management existe exist example contexto connectionstrings app actual c# configurationmanager

c# - not - ConfigurationManager.OpenExeConfiguration-carga el archivo incorrecto?



configurationmanager.connectionstrings c# (4)

He agregado varios archivos app.config (cada uno con un nombre de differet) a un proyecto y los configuré para copiarlos en el directorio de salida de cada compilación.

Intento y accedo al contenido de cada archivo usando esto:

System.Configuration.Configuration o = ConfigurationManager.OpenExeConfiguration(@"app1.config");

El código se ejecuta, pero o.HasFile termina False y o.FilePath termina "app1.config.config". Si cambio a código:

System.Configuration.Configuration o = ConfigurationManager.OpenExeConfiguration(@"app1");

A continuación, el código se bombardea con "Se ha producido un error al cargar un archivo de configuración: el parámetro ''exePath'' no es válido. Nombre del parámetro: exePath".

Si copio / pego el archivo de configuración (así que termino con app1.config y app1.config.config), entonces el código funciona bien, sin embargo, postulo que esta no es una buena solución. Mi pregunta es por lo tanto: ¿cómo puedo usar ConfigurationManager.OpenExeConfiguration para cargar un archivo de configuración de forma correlativa?



No recuerdo dónde encontré esta solución, pero aquí es cómo pude cargar un archivo de configuración de EXE específico:

ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "EXECONFIG_PATH" }; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);


Para evitar este problema por completo, puede leer en el archivo de configuración como un archivo XML, por ejemplo:

using System.Xml; using System.Xml.XPath; XmlDocument doc = new XmlDocument(); doc.Load(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "//..//..//..//MyWebProject//web.config"); string value = doc.DocumentElement.SelectSingleNode("/configuration/appSettings/add[@key=''MyKeyName'']").Attributes["value"].Value;


using System.Reflection; try { Uri UriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase)); string appPath = UriAssemblyFolder.LocalPath; //Open the configuration file and retrieve //the connectionStrings section. Configuration config = ConfigurationManager. OpenExeConfiguration(appPath + @"/" + exeConfigName); ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection; }

Al menos, este es el método que uso para encriptar y descifrar la sección connectionStrings para mis aplicaciones de consola / GUI. exeConfigName es el nombre del ejecutable, incluido el .exe.