web-dev-qa-db-fra.com

Comment trouver le chemin du fichier app.config actif?

J'essaie de finir 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.

161
MatthewMartin

Essaye ça

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

J'espère que ça aide

349
Cédric Rup

À proprement parler, il n’existe pas de fichier de configuration unique. Hors ASP.NET1 il peut y avoir trois fichiers de configuration utilisant le fichier incorporé (System.Configuration) soutien. En plus de la configuration de la machine: app.exe.config, utilisateur itinérant et utilisateur local.

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

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Utilisez différentes valeurs ConfigurationUserLevel pour les fichiers de configuration itinérants et non itinérants à l'utilisation.


1 Qui a un modèle complètement différent où le contenu d'un dossier enfant (système de fichiers virtuel ou IIS) web.config peut (selon le réglage) ajouter ou remplacer le web.config.

61
Richard

Si vous voulez dire que vous n'obtenez qu'un retour nul lorsque vous utilisez NUnit, vous devrez probablement copier la valeur ConnectionString de votre app.config de votre application dans 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 recherche dans son propre app.config (renommé en testAssembly.dll.config lors de la compilation) plutôt que dans le fichier de configuration de vos applications.

Pour obtenir l’emplacement de l’Assemblée que vous utilisez, essayez

System.Reflection.Assembly.GetExecutingAssembly().Location
9
Colin Desmond

Assurez-vous de cliquer sur les propriétés du fichier et de le définir sur "Copier à tout moment", sinon il ne sera pas dans le dossier Debug\avec vos dll joyeuses lil pour configurer où il doit être et ajouter plus de cloche

6
Chad Grant

La première fois que j'ai réalisé que le projet de tests unitaires 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 venais d'ajouter une ligne dans l'événement Post Build du projet Prod. cela copiera le fichier app.config dans le dossier bin du projet 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.

6
Kasper

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);
4
selalerer

En fonction de l'emplacement de votre fichier de configuration, System.Reflection.Assembly.GetExecutingAssembly().Location peut faire ce dont vous avez besoin.

3
William Edmondson

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. Lieu intéressant pour cela.

3
RedGreenCode