Як знайти шлях до активного файлу app.config?


167

Я намагаюся закінчити цей обробник винятків:

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.

Відповіді:


363

Спробуйте це

AppDomain.CurrentDomain.SetupInformation.ConfigurationFile

Сподіваюся, це допомагає


Це набагато краще, ніж намагатися використовувати Assembly.GetEntryAssembly () + ".config", який не працює в деяких ситуаціях в ASP.NET і в деяких ситуаціях при використанні AppDomains.
— Контанго

4
як я можу змінити цей шлях?
— Вигнеш Субраманійський

Дякую. У мене був оновлений проект з VS2008 -> VS2013, який відмовився читати файл app.config. Потім я дізнався через AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, що він шукає XXX.vshost.exe.config, який не створювався. Тому я вимкнув VS хостинг на вкладці налагодження властивостей проекту. Тоді мені довелося перейменувати свій файл app.config в {projectName} .config, покласти його у папку bin, і він нарешті спрацював
— drzounds

1
Не працювало для мене. Однак ця відповідь зробила .
— Кей Зед

4
Що з ядром .net?
— jjxtra

64

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

Для того, щоб отримати «глобальну» конфігурацію ( ехе .config):

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
                    .FilePath

Використовуйте різні ConfigurationUserLevelзначення для файлів конфігурації в роумінгу та не в роумінгу.


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


2
Я вперше покращив "Відповідь", що було дуже корисно. Але наприкінці мені дуже потрібен такий підхід, тож дякую за те, що ви його також виклали тут.
— Ноам Гал

Не забудьте додати посилання на System.configuration
— Black Horus

9

Якщо ви маєте на увазі, що ви отримуєте нульове повернення лише під час використання NUnit, вам, ймовірно, потрібно скопіювати значення ConnectionString вашої app.config вашої програми в app.config вашої тестової бібліотеки.

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

Щоб отримати місце розташування збірки, яку ви працюєте, спробуйте

System.Reflection.Assembly.GetExecutingAssembly().Location

1
Запропонуйте "AppDomain.CurrentDomain.SetupInformation.ConfigurationFile" від @Cedric Rup в іншому випадку ви отримаєте виняток у деяких ситуаціях ASP.NET та в деяких ситуаціях, коли використовуєте AppDomains.
— Контанго

6

Переконайтесь, що ви натискаєте властивості у файлі та встановлюєте його на "Копіювати завжди", інакше він не буде в папці Налагодження \ з вашим щасливим dl-адресом lil, щоб налаштувати, де це потрібно, та додати більше каубер-дзвінка


6

Перший раз, коли я зрозумів, що проект тестування Unit посилався на app.config у цьому проекті, а не на app.config, пов’язаний з моїм виробничим кодовим проектом (звичайно, DOH), я щойно додав рядок у події Post Build проекту Prod що скопіює app.config у папку бін тестового проекту.

Проблема вирішена

Досі я не помічав жодних дивних побічних ефектів, але не впевнений, що це правильне рішення, але, принаймні, це, здається, працює.


4

Тут ще відсутній ще один варіант, який я побачив:

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

Приємне в цьому, хакі, як це виглядає, - це те, що він компілюється під .NET Standard 2.0. Він повертає null під .NET Core 2.0, але він корисний під час міграції.
— EM0

3

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


2
Крім того, ви можете мати декілька "активних" файлів конфігурації одночасно. Machine.config, рамковий рівень web.config, налаштування рівня додатків тощо ... тому я не думаю, що існує спосіб автоматично знайти унікальне розташування файлу рядка підключення без аналізу всіх можливих файлів конфігурації, доступних для вашої програми.
— Вільям Едмондсон,

3

Я спробував одну з попередніх відповідей у ​​веб-додатку (насправді веб-роль 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. Цікаве місце для нього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.