Как найти путь к активному файлу 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.


person MatthewMartin    schedule 27.04.2009    source источник


Ответы (8)


Попробуй это

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
person Cédric Rup    schedule 27.04.2009
comment
Это намного лучше, чем пытаться использовать Assembly.GetEntryAssembly () + .config, которая не работает в некоторых ситуациях в ASP.NET и в некоторых ситуациях при использовании доменов приложений. - person Contango; 08.10.2013
comment
как я могу изменить этот путь? - person Vignesh Subramanian; 06.05.2015
comment
Спасибо. У меня был обновленный проект с VS2008 до VS2013, который отказался читать файл app.config. Затем я узнал через AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, что он искал XXX.vshost.exe.config, который не создавался. Поэтому я отключил VS Hosting на вкладке отладки свойств проекта. Затем мне пришлось переименовать мой файл app.config в {projectName} .config, поместить его в папку bin, и, наконец, он заработал. - person drzounds; 29.06.2016
comment
У меня не получилось. Однако этот ответ сделал. - person Kay Zed; 28.09.2016
comment
Отлично, я смог использовать это, чтобы найти файл конфигурации, используемый при выполнении задания на SQL Server. - person Paul McCarthy; 02.05.2017
comment
А как насчет ядра .net? - person jjxtra; 02.07.2018

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

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

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

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


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

person Richard    schedule 27.04.2009
comment
Сначала я повысил ответ, что было очень полезно. Но в конце концов мне действительно понадобился этот подход, так что спасибо, что разместили его здесь. - person Noam Gal; 08.06.2010
comment
Не забудьте добавить ссылку на System.configuration - person Black Horus; 20.09.2015

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

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

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

System.Reflection.Assembly.GetExecutingAssembly().Location
person Colin Desmond    schedule 27.04.2009
comment
Предложите AppDomain.CurrentDomain.SetupInformation.ConfigurationFile от @Cedric Rup, иначе вы получите исключение в некоторых ситуациях в ASP.NET и в некоторых ситуациях при использовании доменов приложений. - person Contango; 08.10.2013

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

person Chad Grant    schedule 27.04.2009

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

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

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

person Kasper    schedule 06.05.2009

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

const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);
person selalerer    schedule 01.02.2017
comment
Каким бы хакерским это ни выглядело, это хорошо то, что компилируется под .NET Standard 2.0. Он возвращает значение null в .NET Core 2.0, но полезно во время миграции. - person EM0; 18.01.2018

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

person William Edmondson    schedule 27.04.2009
comment
Кроме того, вы можете иметь несколько активных файлов конфигурации одновременно. Machine.config, web.config уровня фреймворка, конфигурация уровня приложения и т. Д., Поэтому я не думаю, что есть способ автоматически найти уникальное местоположение файла строки подключения без анализа всех возможных файлов конфигурации, доступных вашему приложению. - person William Edmondson; 27.04.2009

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

person RedGreenCode    schedule 17.06.2014