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