Come trovare il percorso del file app.config attivo?


167

Sto cercando di completare questo gestore eccezioni:

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

Questo problema sembra accadere solo a me quando utilizzo nUnit.

Risposte:


363

Prova questo

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

Spero che sia d'aiuto


Questo è molto meglio del tentativo di usare Assembly.GetEntryAssembly () + ".config" che non funziona in alcune situazioni in ASP.NET e in alcune situazioni quando si utilizza AppDomains.
Contango,

4
come posso cambiare questo percorso?
Vignesh Subramanian,

Grazie. Ho avuto un progetto aggiornato da VS2008 -> VS2013 che ha rifiutato di leggere il file app.config. Quindi ho appreso tramite AppDomain.CurrentDomain.SetupInformation.ConfigurationFile che stava cercando XXX.vshost.exe.config che non veniva generato. Quindi l'ho disattivato VS Hosting nella scheda debug delle proprietà del progetto. Quindi ho dovuto rinominare il mio file app.config in {projectName} .config, inserirlo nella cartella bin e alla fine ha funzionato
drzounds,

1
Non ha funzionato per me. Questa risposta ha fatto comunque.
Kay Zed,

4
Che dire di .net core?
jjxtra,

64

A rigor di termini, non esiste un singolo file di configurazione. Escludendo ASP.NET 1 ci possono essere tre file di configurazione usando il System.Configurationsupporto inbuilt ( ). Oltre alla configurazione della macchina:, app.exe.configroaming utente e utente locale.

Per ottenere la configurazione "globale" ( exe .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Utilizzare ConfigurationUserLevelvalori diversi per i file di configurazione roaming e non roaming per uso.


1 Che ha un modello completamente diverso in cui il contenuto di una cartella figlio (IIS-virtuale o file system) web.configpuò (a seconda dell'impostazione) aggiungere o sovrascrivere quello del genitore web.config.


2
Per prima cosa ho aumentato la "Risposta", che è stata molto utile. Ma alla fine avevo davvero bisogno di questo approccio, quindi grazie per averlo messo anche qui.
Noam Gal,

Non dimenticare di aggiungere un riferimento a System.configuration
Black Horus

9

Se intendi che stai ottenendo un ritorno nullo solo quando usi NUnit, allora probabilmente dovrai copiare il valore ConnectionString il tuo app.config della tua applicazione nel app.config della tua libreria di test.

Quando viene eseguito dal caricatore di test, l'assembly di test viene caricato in fase di esecuzione e verrà visualizzato nel proprio app.config (rinominato in testAssembly.dll.config al momento della compilazione) anziché nel file di configurazione delle applicazioni.

Per ottenere la posizione dell'assembly in esecuzione, provare

System.Reflection.Assembly.GetExecutingAssembly().Location

1
Suggerisci "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" da @Cedric Rup, altrimenti otterrai un'eccezione in alcune situazioni in ASP.NET e in alcune situazioni quando usi AppDomains.
Contango,

6

Assicurati di fare clic sulle proprietà del file e impostarlo su "copia sempre" o non sarà nella cartella Debug \ con i tuoi lil dll felici per configurare dove deve essere e aggiungere altro campanaccio


6

La prima volta che mi sono reso conto che il progetto Unit testing faceva riferimento a app.config in quel progetto piuttosto che a app.config associato al mio progetto di codice di produzione (ovviamente, DOH) ho appena aggiunto una riga nell'evento Post Build del progetto Prod che copierà app.config nella cartella bin del progetto di test.

Problema risolto

Finora non ho notato strani effetti collaterali, ma non sono sicuro che questa sia la soluzione giusta, ma almeno sembra funzionare.


4

Un'altra opzione che ho visto manca qui:

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

La cosa bella di questo, a quanto pare, è che si compila in .NET Standard 2.0. Restituisce null in .NET Core 2.0, ma è utile durante la migrazione.
EM0

3

A seconda della posizione del tuo file di configurazione, System.Reflection.Assembly.GetExecutingAssembly().Locationpotresti fare ciò che ti serve.


2
Inoltre, è possibile disporre contemporaneamente di più file di configurazione "attivi". Machine.config, web.config a livello di framework, configurazione a livello di app, ecc ... quindi non credo che ci sia un modo per individuare automaticamente una posizione univoca del file della stringa di connessione senza analizzare tutti i possibili file di configurazione disponibili per la tua app.
William Edmondson,

3

Ho provato una delle risposte precedenti in un'app Web (in realtà un ruolo Web di Azure eseguito localmente) e non ha funzionato del tutto. Tuttavia, questo approccio simile ha funzionato:

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

Il file di configurazione si è rivelato essere in C: \ Programmi \ IIS Express \ MyComponent.dll.config. Posto interessante per questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.