Wie finde ich den Pfad der aktiven Datei app.config?

167

Ich versuche, diesen Ausnahmebehandler zu beenden:

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

Dieses Problem scheint mir nur zu passieren, wenn ich nUnit verwende.

MatthewMartin
quelle

Antworten:

363

Versuche dies

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

Ich hoffe es hilft

Cédric Rup
quelle
Dies ist Wayyyyyyyy besser als der Versuch, Assembly.GetEntryAssembly () + ".config" zu verwenden, was in einigen Situationen in ASP.NET und in einigen Situationen bei Verwendung von AppDomains nicht funktioniert.
Contango
4
Wie kann ich diesen Pfad ändern?
Vignesh Subramanian
Danke dir. Ich hatte ein Projekt von VS2008 -> VS2013 aktualisiert, das sich weigerte, die Datei app.config zu lesen. Dann erfuhr ich über AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, dass nach XXX.vshost.exe.config gesucht wurde, das nicht generiert wurde. Also habe ich VS Hosting auf der Registerkarte Debuggen der Projekteigenschaften deaktiviert. Dann musste ich meine app.config-Datei in {projectName} .config umbenennen, in den bin-Ordner legen und es funktionierte schließlich
drzounds
1
Hat bei mir nicht funktioniert. Diese Antwort tat es jedoch.
Kay Zed
4
Was ist mit .net Core?
jjxtra
64

Genau genommen gibt es keine einzige Konfigurationsdatei. Mit Ausnahme von ASP.NET 1 können mithilfe der System.ConfigurationUnterstützung von inbuilt ( ) drei Konfigurationsdateien vorhanden sein . Zusätzlich zur Computerkonfiguration : app.exe.config, Benutzerroaming und Benutzerlokal.

So erhalten Sie die "globale" Konfiguration ( exe .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Verwenden Sie unterschiedliche ConfigurationUserLevelWerte für Roaming- und Nicht-Roaming-Konfigurationsdateien pro Verwendung.


1 Das Modell hat ein völlig anderes Modell, bei dem der Inhalt eines untergeordneten Ordners (IIS-virtuell oder Dateisystem) web.config(abhängig von der Einstellung) dem des übergeordneten Ordners hinzugefügt oder diesen überschreiben kann web.config.

Richard
quelle
2
Ich habe zuerst die "Antwort" erhöht, was sehr hilfreich war. Aber am Ende brauchte ich diesen Ansatz wirklich, also danke, dass du ihn auch hier aufgestellt hast.
Noam Gal
Vergessen Sie nicht, einen Verweis auf System.configuration
Black Horus
9

Wenn Sie meinen, dass Sie nur dann eine Null-Rückgabe erhalten, wenn Sie NUnit verwenden, müssen Sie wahrscheinlich den ConnectionString-Wert Ihrer app.config Ihrer Anwendung in die app.config Ihrer Testbibliothek kopieren.

Wenn es vom Testloader ausgeführt wird, wird die Testassembly zur Laufzeit geladen und in ihrer eigenen app.config (zur Kompilierungszeit in testAssembly.dll.config umbenannt) und nicht in Ihrer Anwendungskonfigurationsdatei angezeigt.

Versuchen Sie es, um den Speicherort der Baugruppe zu ermitteln, die Sie ausführen

System.Reflection.Assembly.GetExecutingAssembly().Location
Colin Desmond
quelle
1
Schlagen Sie "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" von @Cedric Rup vor, andernfalls wird in einigen Situationen in ASP.NET und in einigen Situationen bei Verwendung von AppDomains eine Ausnahme angezeigt.
Contango
6

Stellen Sie sicher, dass Sie auf die Eigenschaften der Datei klicken und sie auf "Immer kopieren" setzen. Andernfalls befindet sie sich nicht im Ordner "Debug \" mit Ihren Happy Lil DLLs, um zu konfigurieren, wo sie sein muss, und fügen Sie weitere Cowbell hinzu

Chad Grant
quelle
6

Als ich zum ersten Mal feststellte, dass das Unit-Test-Projekt auf die app.config in diesem Projekt und nicht auf die app.config verweist, die meinem Produktionscode-Projekt zugeordnet ist (natürlich DOH), habe ich gerade eine Zeile im Post-Build-Ereignis des Prod-Projekts hinzugefügt Dadurch wird die Datei app.config in den Ordner bin des Testprojekts kopiert.

Problem gelöst

Ich habe bisher keine seltsamen Nebenwirkungen bemerkt, bin mir aber nicht sicher, ob dies die richtige Lösung ist, aber zumindest scheint es zu funktionieren.

Kasper
quelle
4

Eine weitere Option, die ich gesehen habe, fehlt hier:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);
Selalerer
quelle
Das Schöne daran, so hackig es aussieht, ist, dass es unter .NET Standard 2.0 kompiliert wird. Unter .NET Core 2.0 wird null zurückgegeben, dies ist jedoch während der Migration hilfreich.
EM0
3

Abhängig vom Speicherort Ihrer Konfigurationsdatei können Sie System.Reflection.Assembly.GetExecutingAssembly().Locationmöglicherweise das tun, was Sie benötigen.

William Edmondson
quelle
2
Außerdem können Sie mehrere "aktive" Konfigurationsdateien gleichzeitig haben. Machine.config, web.config auf Framework-Ebene, config auf App-Ebene usw. Ich glaube also nicht, dass es eine Möglichkeit gibt, einen eindeutigen Speicherort für Verbindungszeichenfolgendateien automatisch zu finden, ohne alle möglichen Konfigurationsdateien zu analysieren, die Ihrer App zur Verfügung stehen.
William Edmondson
3

Ich habe eine der vorherigen Antworten in einer Webanwendung ausprobiert (eigentlich eine Azure-Webrolle, die lokal ausgeführt wird), und es hat nicht ganz funktioniert. Dieser ähnliche Ansatz hat jedoch funktioniert:

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

Die Konfigurationsdatei befand sich in C: \ Programme \ IIS Express \ MyComponent.dll.config. Interessanter Ort dafür.

RedGreenCode
quelle