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