Как найти путь к активному файлу app.config?

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

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.

Ответ 1

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

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

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

Ответ 2

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

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

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

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


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

Ответ 3

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

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

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

System.Reflection.Assembly.GetExecutingAssembly().Location

Ответ 4

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

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

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

Ответ 5

Убедитесь, что вы щелкнете свойства в файле и установите для него "копировать всегда", или он не будет находиться в папке "Отладка" с вашей DLL файлом happy lil, чтобы настроить, где это необходимо, и добавить больше колокольчиков

Ответ 6

Я попробовал один из предыдущих ответов в веб-приложении (на самом деле веб-роль 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. Интересное место для него.

Ответ 7

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

Ответ 8

Еще один вариант, который я видел, отсутствует здесь:

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