¿Cómo encontrar la ruta del archivo app.config activo?

167

Estoy tratando de terminar este controlador de excepciones:

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 que solo me sucede cuando estoy usando nUnit.

MatthewMartin
fuente

Respuestas:

363

Prueba esto

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

Espero eso ayude

Cédric Rup
fuente
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
44
¿Cómo puedo cambiar este camino?
Vignesh Subramanian
Gracias. Tenía un proyecto actualizado de VS2008 -> VS2013 que se negaba 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. Entonces lo apagué VS Hosting en la pestaña de depuración de 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
1
No funciono para mi. Esta respuesta lo hizo sin embargo.
Kay Zed
44
¿Qué pasa con .net core?
jjxtra
64

Estrictamente hablando, no hay un solo archivo de configuración. Excluyendo ASP.NET 1 , puede haber tres archivos de configuración utilizando el System.Configurationsoporte inbuilt ( ). Además de la configuración de la máquina: app.exe.configusuario itinerante y usuario local.

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

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Use ConfigurationUserLevelvalores diferentes para los archivos de configuración de roaming y no roaming por uso.


1 Que tiene un modelo completamente diferente en el que el contenido de las carpetas secundarias (IIS-virtual o sistema de archivos) web.configpuede (según la configuración) agregar o anular el de los padres web.config.

Ricardo
fuente
2
Primero subí la "Respuesta", que fue muy útil. Pero al final realmente necesitaba este enfoque, así que gracias por ponerlo aquí también.
Noam Gal
No olvide agregar una referencia a System.configuration
Black Horus
9

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

Cuando lo ejecuta el cargador de prueba, el ensamblaje de prueba se carga en tiempo de ejecución y se verá en su propia aplicación.config (renombrada 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 ensamblaje que está ejecutando, intente

System.Reflection.Assembly.GetExecutingAssembly().Location
Colin Desmond
fuente
1
Sugiera "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" de @Cedric Rup; de lo contrario, obtendrá una excepción en algunas situaciones en ASP.NET y en otras situaciones cuando use AppDomains.
Contango
6

Asegúrate de hacer clic en las propiedades del archivo y configurarlo para "copiar siempre" o no estará en la carpeta Debug \ con tus felices lil dll para configurar dónde debe estar y agregar más cencerro

Chad Grant
fuente
6

La primera vez que me di cuenta de que el proyecto de prueba de la Unidad hacía referencia a la aplicación.config en ese proyecto en lugar de la aplicación.config asociada con mi proyecto de código de producción (por supuesto, DOH), acabo de agregar una línea en el Evento posterior a la compilación del proyecto Prod eso copiará el archivo app.config a la carpeta bin del proyecto de prueba.

Problema resuelto

No he notado ningún efecto secundario extraño hasta ahora, pero no estoy seguro de que esta sea la solución correcta, pero al menos parece funcionar.

Kasper
fuente
4

Falta una opción más que vi aquí:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);
sellador
fuente
Lo bueno de esto, hacky como parece, es que se compila bajo .NET Standard 2.0. Devuelve nulo en .NET Core 2.0, pero es útil durante la migración.
EM0
3

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

William Edmondson
fuente
2
Además, puede tener varios archivos de configuración "activos" al mismo tiempo. Machine.config, framework level web.config, app level config, 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.
William Edmondson
3

Intenté una de las respuestas anteriores en una aplicación web (en realidad, un rol web de Azure que se ejecuta localmente) y no funcionó. Sin embargo, este enfoque similar funcionó:

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

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

RedGreenCode
fuente