2009-04-27 34 views
144

estoy tratando de terminar este gestor de excepciones:¿Cómo encontrar la ruta del archivo app.config activo?

if (ConfigurationManager.ConnectionStrings["ConnectionString"]==null) 
{ 
    string pathOfActiveConfigFile = ...? 
    throw new ConfigurationErrorsException(
     "You either forgot to set the connection string, or " + 
     "you're using a unit test framework that looks for "+ 
     "the config file in strange places, update this file : " 
     + pathOfActiveConfigFile); 
} 

Este problema parece ocurrir sólo a mí cuando estoy usando nUnit.

Respuesta

315

probar este

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 

creo que sirve

+0

Esto es mucho mejor que tratar de usar Assembly.GetEntryAssembly() + ".config" que no funciona en algunas situaciones en ASP.NET y en algunas situaciones cuando se usan AppDomains. – Contango

+3

¿cómo puedo cambiar esta ruta? –

+0

Gracias. Tuve un proyecto actualizado de VS2008 -> VS2013 que se negó a leer el archivo app.config. Luego aprendí a través de AppDomain.CurrentDomain.SetupInformation.ConfigurationFile que estaba buscando XXX.vshost.exe.config que no se estaba generando. Así que lo desactivé VS Hosting en la pestaña de depuración de las propiedades del proyecto. Luego tuve que cambiar el nombre de mi archivo app.config a {projectName} .config, ponerlo en la carpeta bin y finalmente funcionó – drzounds

8

Si quiere decir que solo obtiene un retorno nulo cuando usa NUnit, entonces probablemente necesite copiar el valor de ConnectionString como su app.config de su aplicación al app.config de su biblioteca de prueba.

Cuando es ejecutado por el cargador de prueba, el ensamblaje de prueba se carga en tiempo de ejecución y buscará en su propio app.config (renombrado a testAssembly.dll.config en tiempo de compilación) en lugar de su archivo de configuración de aplicaciones.

para obtener la ubicación del montaje que se está ejecutando, intente

System.Reflection.Assembly.GetExecutingAssembly().Location 
+1

sugieren que "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" de @Cedric Rup de lo contrario obtendrá una excepción en algunas situaciones en ASP.NET y en algunos situaciones al usar AppDomains. – Contango

3

Dependiendo de la ubicación de su archivo de configuración System.Reflection.Assembly.GetExecutingAssembly().Location podría hacer lo que necesita.

+2

Además, puede tener varios archivos de configuración "activos" al mismo tiempo. Machine.config, framework level web.config, configuración de nivel de aplicación, etc. ... así que no creo que haya una manera de localizar automáticamente una ubicación de archivo de cadena de conexión única sin analizar todos los posibles archivos de configuración disponibles para su aplicación. –

5

Asegúrese de hacer clic en las propiedades del archivo y otra vez en "copia siempre" o no va a estar en la carpeta de depuración \ con su feliz lil dll's para configurar dónde debe estar y agregar más cencerro

58

Estrictamente hablando, no hay un solo archivo de configuración. Excluyendo ASP.NET , puede haber tres archivos de configuración usando el soporte incorporado (System.Configuration). Además de la configuración de máquina: app.exe.config, roaming de usuario y usuario local.

Para obtener la configuración "global" (exe .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 
        .FilePath 

utilizar diferentes valores para ConfigurationUserLevel itinerancia por uso y los archivos de configuración no itinerantes.


que tiene un modelo completamente diferente, donde el contenido de un niño carpetas (IIS-virtual o sistema de archivos) web.config puede (dependiendo de la configuración) añadir o reemplazar la matriz de web.config.

+2

Primero aumenté la "Respuesta", que fue muy útil. Pero al final realmente necesitaba este enfoque, así que gracias por ponerlo aquí también. –

+0

No olvides agregar una referencia a System.configuration –

6

La primera vez que me di cuenta de que el proyecto de prueba Unit hacía referencia al app.config en ese proyecto en lugar del app.config asociado con mi proyecto de código de producción (por supuesto, DOH) acabo de agregar una línea en el Post Build Event del proyecto Prod que copiará app.config a la carpeta bin del proyecto de prueba.

Problema resuelto

no he notado ningún efecto secundario raro hasta ahora, pero no estoy seguro de que esta es la solución correcta, pero al menos parece que funciona.

3

Intenté una de las respuestas anteriores en una aplicación web (en realidad, una función web Azure ejecutándose localmente) y no funcionó del todo.Sin embargo, este enfoque similar hizo el trabajo:

var map = new ExeConfigurationFileMap { ExeConfigFilename = "MyComponent.dll.config" }; 
var path = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).FilePath; 

El archivo de configuración resultó ser en C: \ Archivos de programa \ IIS Express \ MyComponent.dll.config. Lugar interesante para eso

3

Una opción más que vi no se encuentra aquí:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE"; 
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE); 
+0

Lo bueno de esto, aunque parezca raro, es que compila bajo .NET Standard 2.0. Devuelve null en .NET Core 2.0, pero es útil durante la migración. – EM0

Cuestiones relacionadas