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.

Antworten:


363

Versuche dies

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

Ich hoffe es hilft


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.


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

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


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.


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

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.