Як знайти шлях до активного файлу 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.