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