Створити файл конфігурації .NET для .DLL не є тривіальним і з поважної причини. Механізм конфігурації .NET має безліч функцій, вбудованих у нього, щоб полегшити оновлення / оновлення програми та захистити встановлені програми від витоптування файлів конфігурації.
Існує велика різниця між тим, як використовується DLL, і тим, як використовується програма. Ви навряд чи маєте кілька копій програми, встановлених на одній машині для одного користувача. Але у вас може бути 100 різних додатків або бібліотек, які використовують деякі .NET DLL.
Оскільки рідко виникає необхідність відстежувати налаштування окремо для різних копій програми в межах одного профілю користувача, дуже малоймовірно, що ви хочете, щоб усі різні звички DLL мали спільний доступ до конфігурації. З цієї причини, коли ви отримуєте об’єкт Конфігурація за допомогою "звичайного" методу, об'єкт, який ви отримуєте назад, прив'язується до конфігурації Домену додатків, який ви виконуєте, а не до конкретної збірки.
Домен додатка прив’язаний до кореневої збірки, яка завантажила збірку, на якій насправді знаходиться ваш код. У більшості випадків це збірка вашого основного .EXE, яка завантажувала .DLL. Можна додавати інші домени додатків у програмі, але ви повинні чітко надати інформацію про те, що таке коренева збірка цього домену додатка.
Через все це процедура створення конфігураційного файлу для бібліотеки не така зручна. Це той самий процес, який ви використовували б для створення довільного портативного конфігураційного файлу, не прив'язаного до якоїсь конкретної збірки, але для якого ви хочете використовувати XML-схему .NET, розділ конфігурації та механізми конфігураційних елементів тощо. Це тягне за собою створення ExeConfigurationFileMap
об'єкта , завантаження в дані, щоб визначити, де буде зберігатися конфігураційний файл, а потім виклик ConfigurationManager
. OpenMappedExeConfiguration
щоб відкрити його в новий Configuration
екземпляр. Це дозволить вам відключити захист версії, яку пропонує механізм автоматичного генерування шляху.
Статистично кажучи, ви, ймовірно, використовуєте цю бібліотеку в внутрішніх умовах, і навряд чи ви матимете кілька додатків, які використовують її у будь-якій машині / користувачі. Але якщо ні, то слід пам’ятати про щось. Якщо ви використовуєте єдиний глобальний конфігураційний файл для DLL, незалежно від програми, що посилається на нього, вам потрібно потурбуватися про конфлікти доступу. Якщо два програми, що посилаються на вашу бібліотеку, одночасно запускаються, у кожного з Configuration
відкритим власним об'єктом, тоді, коли один зберігає зміни, наступний раз, коли ви спробуєте отримати або зберегти дані в іншому додатку, це стане винятком.
Найбезпечніший і найпростіший спосіб подолати це - вимагати, щоб збірка, що завантажує вашу DLL, також надала деяку інформацію про себе, або виявити її, вивчивши Домен додатка референтної збірки. Використовуйте це, щоб створити якусь структуру папок для зберігання окремих файлів конфігурації користувача для кожного додатка, що посилається на вашу DLL.
Якщо ви впевнені, що хочете мати глобальні налаштування для DLL незалежно від місця посилання, вам потрібно визначити своє місцезнаходження для цього, а не .NET автоматично визначити відповідний. Вам також потрібно бути агресивними щодо управління доступом до файлу. Вам потрібно буде кешувати якнайбільше, зберігаючи Configuration
екземпляр навколо ТОЛЬКО стільки часу, скільки потрібно для завантаження чи збереження, відкриваючись безпосередньо перед цим і розпоряджаючись відразу після. І нарешті, вам знадобиться механізм блокування для захисту файлу під час його редагування одним із програм, які використовують бібліотеку.