Как найти путь к активному файлу app.config? - PullRequest
160 голосов
/ 27 апреля 2009

Я пытаюсь завершить этот обработчик исключений:

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

Кажется, эта проблема возникает только тогда, когда я использую nUnit.

Ответы [ 8 ]

347 голосов
/ 27 апреля 2009

Попробуйте это

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

Надеюсь, это поможет

61 голосов
/ 27 апреля 2009

Строго говоря, нет единого файла конфигурации. За исключением ASP.NET 1 , может быть три файла конфигурации, использующих встроенную (System.Configuration) поддержку. В дополнение к конфигурации машины: app.exe.config, пользовательский роуминг и локальный пользователь.

Чтобы получить «глобальную» конфигурацию ( exe .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Используйте разные значения ConfigurationUserLevel для файлов конфигурации роуминга и не роуминга для использования.


1 Имеет совершенно другую модель, в которой содержимое дочерних папок (IIS-виртуальная или файловая система) web.config может (в зависимости от настроек) добавлять или переопределять родительский web.config .

9 голосов
/ 27 апреля 2009

Если вы имеете в виду, что при использовании NUnit вы получаете только нулевой возврат, то вам, вероятно, нужно скопировать значение ConnectionString вашего app.config вашего приложения в app.config вашей тестовой библиотеки.

Когда он запускается загрузчиком тестов, тестовая сборка загружается во время выполнения и просматривает свой собственный app.config (переименованный в testAssembly.dll.config во время компиляции), а не файл конфигурации ваших приложений.

Чтобы узнать местоположение сборки, на которой вы работаете, попробуйте

System.Reflection.Assembly.GetExecutingAssembly().Location
6 голосов
/ 07 мая 2009

В первый раз, когда я понял, что проект модульного тестирования ссылается на app.config в этом проекте, а не на app.config, связанный с моим проектом производственного кода (конечно, DOH), я просто добавил строку в событие после сборки: проект Prod, который скопирует app.config в папку bin тестового проекта.

Проблема решена

До сих пор я не заметил каких-либо странных побочных эффектов, но я не уверен, что это правильное решение, но, по крайней мере, похоже, оно работает.

6 голосов
/ 27 апреля 2009

Убедитесь, что вы щелкнули свойства файла и задали для него значение «всегда копировать», иначе он не будет находиться в папке Debug \ вместе с вашими счастливыми детьми, чтобы настроить, где он должен быть, и добавить еще один колокольчик

4 голосов
/ 01 февраля 2017

Здесь отсутствует еще одна опция, которую я видел:

const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);
3 голосов
/ 18 июня 2014

Я попробовал один из предыдущих ответов в веб-приложении (на самом деле веб-роль Azure работает локально), и он не совсем сработал. Тем не менее, подобный подход сработал:

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

Файл конфигурации оказался в C: \ Program Files \ IIS Express \ MyComponent.dll.config. Интересное место для этого.

3 голосов
/ 27 апреля 2009

В зависимости от расположения вашего конфигурационного файла System.Reflection.Assembly.GetExecutingAssembly().Location может делать то, что вам нужно.

...