Comment trouver le chemin du fichier app.config actif?


167

J'essaye de terminer ce gestionnaire d'exceptions:

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 m'arriver que lorsque j'utilise nUnit.

Réponses:


363

Essaye ça

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

J'espère que ça aide


C'est wayyyyyyyy mieux que d'essayer d'utiliser Assembly.GetEntryAssembly () + ".config" qui ne fonctionne pas dans certaines situations dans ASP.NET et dans certaines situations lors de l'utilisation d'AppDomains.
Contango

4
comment puis-je changer ce chemin?
Vignesh Subramanian

Je vous remercie. J'ai eu un projet mis à niveau de VS2008 -> VS2013 qui a refusé de lire le fichier app.config. Ensuite, j'ai appris via AppDomain.CurrentDomain.SetupInformation.ConfigurationFile qu'il recherchait XXX.vshost.exe.config qui n'était pas généré. Je l'ai donc désactivé VS Hosting dans l'onglet de débogage des propriétés du projet. Ensuite, j'ai dû renommer mon fichier app.config en {projectName} .config, le mettre dans le dossier bin et cela a finalement fonctionné
drzounds

1
Cela n'a pas fonctionné pour moi. Cette réponse a cependant.
Kay Zed

4
Qu'en est-il du noyau .net?
jjxtra

64

À proprement parler, il n'y a pas de fichier de configuration unique. À l'exclusion d'ASP.NET 1, il peut y avoir trois fichiers de configuration utilisant la prise en charge inbuilt ( System.Configuration). En plus de la configuration de la machine:, app.exe.configitinérance utilisateur et utilisateur local.

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

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Utilisez des ConfigurationUserLevelvaleurs différentes pour les fichiers de configuration itinérants et non itinérants par utilisation.


1 Qui a un modèle complètement différent où le contenu d'un dossier enfant (IIS-virtuel ou système de fichiers) web.configpeut (selon le paramètre) s'ajouter ou remplacer celui du parent web.config.


2
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 l'avoir mise ici aussi.
Noam Gal

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

9

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

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

Pour obtenir l'emplacement de l'assembly que vous exécutez, essayez

System.Reflection.Assembly.GetExecutingAssembly().Location

1
Suggérez «AppDomain.CurrentDomain.SetupInformation.ConfigurationFile» de @Cedric Rup, sinon vous obtiendrez une exception dans certaines situations dans ASP.NET et dans certaines situations lors de l'utilisation d'AppDomains.
Contango

6

Assurez-vous de cliquer sur les propriétés du fichier et de le définir sur "copier toujours", sinon il ne sera pas dans le dossier Debug \ avec votre joyeux lil dll pour configurer où il doit être et ajouter plus de cloche de vache


6

La première fois que j'ai réalisé que le projet de test unitaire faisait référence à app.config dans ce projet plutôt qu'à app.config associé à mon projet de code de production (bien sûr, DOH), je viens d'ajouter une ligne dans l'événement Post Build du projet Prod 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 étranges jusqu'à présent, mais je ne suis pas sûr que ce soit la bonne solution, mais au moins cela semble fonctionner.


4

Une autre option que j'ai vue manque ici:

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

La bonne chose à ce sujet, aussi pirate que cela puisse paraître, est qu'il se compile sous .NET Standard 2.0. Il renvoie null sous .NET Core 2.0, mais il est utile lors de la migration.
EM0

3

Selon l'emplacement de votre fichier de configuration, vous System.Reflection.Assembly.GetExecutingAssembly().Locationpouvez faire ce dont vous avez besoin.


2
De plus, vous pouvez avoir plusieurs fichiers de configuration «actifs» en même temps. Machine.config, web.config au niveau du framework, configuration au niveau de l'application, etc.
William Edmondson

3

J'ai essayé l'une des réponses précédentes dans une application Web (en fait un rôle Web Azure s'exécutant localement) et cela n'a pas tout à fait fonctionné. Cependant, cette approche similaire a fonctionné:

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

Le fichier de configuration s'est avéré être dans C: \ Program Files \ IIS Express \ MyComponent.dll.config. Endroit intéressant pour cela.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.