2009-07-05 20 views
30

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.ConfigurationManager.OpenExeConfiguration - carga el archivo incorrecto?

trato y acceder a los contenidos de cada archivo utilizando la siguiente:

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

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

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

A continuación, las bombas de código con "Error al cargar un fichero de configuración: El parámetro 'ExePath' no es válido Nombre de 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?

Respuesta

21

De acuerdo con http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9 el parámetro es la ubicación de un exe, y el método busca la configuración correspondiente a ese exe (¡supongo que el nombre del parámetro de exePath tiene sentido ahora!).

+4

Tenga en cuenta que puede pasar cualquier ruta de acceso a un conjunto, no sólo un exe. Así que le das "SomeLib.dll", se abriría "SomeLib.dll.config". Es útil cuando su proyecto .NET es realmente solo un complemento para otra aplicación para la que no desea implementar un .config junto a su ejecutable. – Ludovic

+0

Sin embargo, cuando puse un archivo llamado app.config en el directorio de la dll, usando "app" como el parámetro exePath, tuve que cambiar el nombre del archivo a la aplicación antes de que funcionara ... – tobbenb3

7

Para evitar este problema por completo, se 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; 
+0

Gracias por la XPath camino. He estado usando ConfigurationManager durante aproximadamente dos días con Configuration.AppSettings.Settings.Count = 0. Su método al menos me establece el valor correcto. – TamusJRoyce

+1

Definitivamente un buen trabajo :) – ykatchou

2
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 utilizo el cifrado y descifrado los connectionStrings sección para mis aplicaciones de consola/GUI. exeConfigName es el nombre del ejecutable, incluido el .exe.

44

No puedo recordar donde me encontré con esta solución pero aquí es cómo me las arreglé para cargar un archivo de configuración exe específica:

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

¡Eso funciona! Loco que fue tanto trabajo descifrar cómo leer un archivo de configuración pésimo de una ruta exacta especificada, pero gracias. – neminem

+1

¿Cómo se usa el 'config.AppSettings [" somekey "]' resultante (o 'config.AppSettings.Settings []') sin permisos de permiso de acceso? –

+1

@Rubistro debe comprobar si el elemento existe (de lo contrario, config.AppSettings ["somekey"] devuelve nulo) y luego usar .Value – Jedidja

Cuestiones relacionadas