Создать файл конфигурации .NET для .DLL нетривиально, и на то есть веская причина. Механизм конфигурации .NET имеет множество встроенных функций, облегчающих обновление / обновление приложения, а также защищающих установленные приложения от утраты файлов конфигурации друг друга.
Существует большая разница между тем, как используется DLL и как используется приложение. Вам вряд ли удастся установить несколько копий приложения на одном компьютере для одного и того же пользователя. Но у вас вполне может быть 100 различных приложений или библиотек, использующих некоторые библиотеки .NET DLL.
Несмотря на то, что редко требуется отдельно отслеживать настройки для разных копий приложения в одном профиле пользователя, очень маловероятно, что вы захотите, чтобы все различные варианты использования DLL делили конфигурацию с каждым Другой. По этой причине при извлечении объекта конфигурации с использованием «обычного» метода возвращаемый объект привязывается к конфигурации домена приложения, в котором вы выполняете, а не к конкретной сборке.
Домен приложения привязан к корневой сборке, которая загрузила сборку, в которой фактически находится ваш код. В большинстве случаев это будет сборка вашего основного .EXE, то есть то, что загрузило .DLL. Есть возможность раскрутить другие домены приложения в приложении, но вы должны явно предоставить информацию о том, что является корневой сборкой этого домена приложения.
Из-за всего этого процедура создания файла конфигурации для конкретной библиотеки не очень удобна. Это тот же процесс, который вы использовали бы для создания произвольного переносимого файла конфигурации, не привязанного к какой-либо конкретной сборке, но для которого вы хотите использовать XML-схему .NET, раздел конфигурации и механизмы элементов конфигурации и т. Д. Это влечет за собой создание ExeConfigurationFileMap
объект, загружающий данные, чтобы определить, где будет храниться файл конфигурации, и затем вызывающий ConfigurationManager
. OpenMappedExeConfiguration
, чтобы открыть его в новый экземпляр Configuration
. Это будет отрезать вас от защиты версий, предлагаемой механизмом автоматической генерации пути.
С точки зрения статистики, вы, вероятно, используете эту библиотеку в домашних условиях, и вряд ли у вас будет несколько приложений, использующих ее на одном компьютере / пользователе. Но , если нет, то следует помнить кое-что. Если вы используете один глобальный файл конфигурации для вашей DLL, независимо от того, какое приложение ссылается на него, вам нужно беспокоиться о конфликтах доступа. Если два приложения, ссылающиеся на вашу библиотеку, работают одновременно, каждое из которых имеет собственный открытый объект Configuration
, то при сохранении изменений одно из них вызовет исключение при следующей попытке получить или сохранить данные в другом приложении.
Самый безопасный и простой способ обойти это - потребовать, чтобы сборка, загружающая вашу DLL, также предоставила некоторую информацию о себе, или обнаружить ее, изучив домен приложения ссылочной сборки. Используйте это, чтобы создать некую структуру папок для хранения отдельных пользовательских файлов конфигурации для каждого приложения, ссылающегося на вашу DLL.
Если вы уверены, , что вы хотите иметь глобальные настройки для вашей DLL, независимо от того, где она указана, вам нужно будет определить свое местоположение для нее, а не .NET автоматически выяснить подходящее. Вам также нужно быть агрессивным в управлении доступом к файлу. Вам нужно будет как можно больше кэшировать, сохраняя экземпляр Configuration
ТОЛЬКО столько, сколько требуется для загрузки или сохранения, открывая непосредственно перед и удаляя сразу после. И наконец, вам понадобится механизм блокировки для защиты файла во время его редактирования одним из приложений, использующих библиотеку.