186 votes

Comment trouver le chemin du fichier app.config actif ?

J'essaie de terminer ce gestionnaire d'exception :

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);
}

Ce problème semble ne se produire que lorsque j'utilise nUnit.

380voto

Cédric Rup Points 5363

Essayez ceci

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

0 votes

C'est beaucoup mieux que d'essayer d'utiliser Assembly.GetEntryAssembly() + ".config" qui ne fonctionne pas dans certaines situations en ASP.NET et dans certaines situations en utilisant AppDomains.

5 votes

Comment puis-je changer ce chemin ?

0 votes

Merci. J'avais un projet mis à jour de VS2008 -> VS2013 qui refusait de lire le fichier app.config. Puis j'ai appris via AppDomain.CurrentDomain.SetupInformation.ConfigurationFile qu'il recherchait XXX.vshost.exe.config qui n'était pas généré . J'ai donc désactivé VS Hosting dans l'onglet debug des propriétés du projet. Ensuite, j'ai dû renommer mon fichier app.config en {nomduprojet}.config, le placer dans le dossier bin et cela a finalement fonctionné.

72voto

Richard Points 54016

À proprement parler, il n'existe pas de fichier de configuration unique. À l'exception d'ASP.NET 1 il peut y avoir trois fichiers de configuration utilisant la fonction intégrée ( System.Configuration ) de soutien. En plus de la configuration de la machine : app.exe.config l'utilisateur itinérant et l'utilisateur local.

Pour obtenir la configuration "globale" ( exe .config) :

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Utilisez différents ConfigurationUserLevel pour les fichiers de configuration d'itinérance et de non-itinérance à l'usage.


1 Ce qui a un modèle complètement différent où le contenu d'un dossier enfant (IIS-virtuel ou système de fichiers) web.config peuvent (en fonction du paramètre) s'ajouter ou remplacer les paramètres du parent. web.config .

2 votes

J'ai d'abord augmenté la "Réponse", ce qui a été très utile. Mais à la fin, j'avais vraiment besoin de cette approche, alors merci de la mettre ici aussi.

0 votes

N'oubliez pas d'ajouter une référence à System.configuration

9voto

Colin Desmond Points 2946

Si vous voulez dire que vous n'obtenez qu'un retour nul lorsque vous utilisez NUnit, vous devez probablement copier la valeur de ConnectionString de l'app.config de votre application dans l'app.config de votre bibliothèque de test.

Lorsqu'il est exécuté par le chargeur de test, l'assemblage de test est chargé au moment de l'exécution et consulte son propre app.config (renommé testAssembly.dll.config au moment de la compilation) plutôt que le fichier de configuration de vos applications.

Pour obtenir l'emplacement de l'assemblage que vous exécutez, essayez de faire ce qui suit

System.Reflection.Assembly.GetExecutingAssembly().Location

1 votes

Suggérer "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" de @Cedric Rup sinon vous obtiendrez une exception dans certaines situations en ASP.NET et dans certaines situations lors de l'utilisation d'AppDomains.

6voto

Kasper Points 1351

La première fois que j'ai réalisé que le projet de test unitaire faisait référence à l'app.config de ce projet plutôt qu'à l'app.config associé à mon projet de code de production (bien sûr, DOH), j'ai simplement ajouté une ligne dans l'événement post-construction du projet de production qui copiera l'app.config dans le dossier bin du projet de test.

Problème résolu

Je n'ai pas remarqué d'effets secondaires bizarres jusqu'à présent, mais je ne suis pas sûr que ce soit la bonne solution, mais au moins cela semble fonctionner.

6voto

Chad Grant Points 16571

Assurez-vous de cliquer sur les propriétés du fichier et de le paramétrer sur "copier toujours", sinon il ne sera pas dans le dossier Debug\ avec vos joyeuses dll pour configurer où il doit être et ajouter plus de cowbell.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X