2009-04-27 16 views
144

sto cercando di finire questo gestore di eccezioni:Come trovare il percorso del file app.config attivo?

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 sto utilizzando NUnit.

risposta

315

Prova questa

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 

Speranza che aiuta

+0

Questo è wayyyyyyyy migliore di provare a utilizzare Assembly.GetEntryAssembly() + ".config" che non funziona in alcune situazioni in ASP.NET e in alcune situazioni quando si utilizzano AppDomains. – Contango

+3

come posso cambiare questo percorso? –

+0

Grazie. Avevo un progetto aggiornato da VS2008 -> VS2013 che si rifiutava di leggere il file app.config. Poi ho appreso tramite AppDomain.CurrentDomain.SetupInformation.ConfigurationFile che stava cercando XXX.vshost.exe.config che non è stato generato. Così ho spento VS Hosting nella scheda di debug delle proprietà del progetto. Poi ho dovuto rinominare il mio file app.config in {projectName} .config, metterlo nella cartella bin e alla fine ha funzionato – drzounds

8

Se si intende il ritorno null quando si utilizza NUnit, è probabile che sia necessario copiare il valore ConnectionString dell'app.config dell'applicazione nell'app.config della libreria di test.

Quando viene eseguito dal caricatore di prova, il montaggio di prova viene caricato in fase di esecuzione e cercherà nel proprio app.config (rinominato testAssembly.dll.config al momento della compilazione) piuttosto che le applicazioni file di configurazione.

per ottenere la posizione del gruppo si sta eseguendo, provare

System.Reflection.Assembly.GetExecutingAssembly().Location 
+1

Suggerisci "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" dal @Cedric Rup altrimenti si otterrà un'eccezione in alcune situazioni in ASP.NET e in alcuni situazioni in cui si utilizza AppDomains. – Contango

3

A seconda della posizione del file di configurazione System.Reflection.Assembly.GetExecutingAssembly().Location potrebbe fare quello che ti serve.

+2

Inoltre, è possibile avere diversi file di configurazione "attivi" allo stesso tempo. Machine.config, livello framework web.config, config a livello di app, ecc ... quindi non penso che ci sia un modo per localizzare automaticamente una posizione di file di stringa di connessione univoca senza analizzare tutti i possibili file di configurazione disponibili per la tua app. –

5

Verificare di aver scelto le proprietà sul file e impostarlo su "copiare sempre" o non sarà nella cartella Debug \ con il felice lil dll per configurare dove deve essere e aggiungere più cowbell

58

In senso stretto, non esiste un singolo file di configurazione. Escluso ASP.NET ci possono essere tre file di configurazione usando il supporto integrato (System.Configuration). Oltre alla configurazione della macchina: app.exe.config, roaming utente e locale dell'utente.

per ottenere la configurazione "globale" (exe ​​ config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 
        .FilePath 

utilizzano diversi ConfigurationUserLevel valori per per-use file di configurazione non roaming il roaming e.


Il che ha un modello completamente diverso in cui il contenuto di un bambino cartelle (IIS-virtuale o file system) web.config può (a seconda delle impostazioni) aggiungere o sovrascrivere il genitore web.config.

+2

Ho prima alzato la "risposta", che è stata molto utile. Ma alla fine avevo davvero bisogno di questo approccio, quindi grazie per averlo messo anche qui. –

+0

Non dimenticare di aggiungere un riferimento a System.configuration –

6

La prima volta che mi sono reso conto che il progetto di verifica dell'unità faceva riferimento a app.config in quel progetto piuttosto che app.config associato al mio progetto di codice di produzione (fuori rotta, 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

non ho notato alcun effetto collaterale strani finora, ma non sono sicuro che questa sia la soluzione giusta, ma almeno sembra funzionare.

3

Ho provato una delle risposte precedenti in un'app Web (in realtà un ruolo Web di Azure in esecuzione in locale) e non ha funzionato.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 è rivelata in C: \ Program Files \ IIS Express \ MyComponent.dll.config. Posto interessante per questo.

3

Un'altra opzione che ho visto qui manca:

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

La cosa bella di questo, hacky come sembra, è che compila sotto .NET 2.0 Standard. Restituisce null sotto .NET Core 2.0, ma è utile durante la migrazione. – EM0

Problemi correlati