Элемент <codebase> и пространство имен System.Configuration
72C# --- Сборки .NET --- Элемент <codebase> и пространство имен System.Configuration
Элемент <codebase>
В конфигурационных файлах приложений с помощью элемента <codeBase> можно указывать так называемые кодовые базы. Этот элемент заставляет CLR-среду выполнять поиск зависимых сборок в различных местах (например, в сетевых конечных точках или каталогах, находящихся на той же машине, но за пределами каталога клиентского приложения).
Если в <codeBase> указано место на удаленной машине,сборка будет загружаться только по требованию и только в определенный каталог внутри GAC, называемый кэшем загрузки. На основе того, что уже известно о развертывании сборок в GAC, ясно, что сборки, загружаемые из указанного в <codeBase> места, должны иметь строгие имена (иначе CLR-среда не смогла бы их инсталлировать в GAC). Просмотреть содержимое кэша загрузки на своей машине можно, запустив утилиту gacutil.exe с опцией /ldl:
gacutil /ldl
С технической точки зрения элемент <codeBase> допускается использовать и для поиска сборок, не обладающих строгим именем. В таком случае место размещения сборки должно указываться относительно каталога клиентского приложения (в таком случае этот элемент является не более чем альтернативой <privatePath>).
Элемент <codeBase> размещается внутри элемента <assemblyldentity>, в котором в атрибутах name и publicKeyToken указазывается ассоциируемое со сборкой дружественное имя и значение открытого ключа. В самом элементе <codeBase> сообщается версия и (в свойстве href) место размещения сборки, которая должна загружаться. Благодаря этому, даже в случае удаления сборки из GAC, данное клиентское приложение все равно будет успешно выполняться, потому что CLR-среда сможет находить необходимую внешнюю сборку в исходном каталоге.
Размещение сборок в произвольных местах на машине для разработки, по сути, приводит к перестройке системного реестра (и, соответственно, возникновению "ада DLL"), из-за чего при перемещении или переименовании папки, в которой содержатся двоичные файлы, текущие связи будут нарушаться. Поэтому элементом <codeBase> следует пользоваться с осторожностью.
Элемент <codeBase> может быть удобен при добавлении ссылки на сборки, находящиеся на удаленной машине в сети. Например, предположим, что есть разрешение на доступ к папке, находящейся по адресу http://www.MySite.com. В таком случае, чтобы обеспечить загрузку из нее удаленного файла *.dll в кэш загрузки GAC на локальной машине, можно обновить элемент <codeBase> следующим образом:
<codeBase version="2.0.0.0" href="http://www.MySite.com/Assemblies/CarLibrary.dll" />
Пространство имен System.Configuration
До сих пор во всех показанных файлах *.config применялись лишь хорошо известные XML-элементы для указания CLR-среде, где следует искать внешние сборки. Помимо этих элементов, в конфигурационный файл клиента можно также включать и касающиеся только конкретного приложения данные, не имеющие ничего общего с механизмом связывания. В связи с этим неудивительно, что в составе .NET Framework поставляется пространство имен, которое позволяет программно считывать данные из конфигурационного файла клиента.
Это пространство имен называется System.Configuration и включает в себя небольшой набор типов, которые могут применяться для считывания специальных настроек из конфигурационного файла клиента. Эти специальные настройки должны содержаться внутри элемента <appSettings>. Элемент <appSettings>, в свою очередь, может содержать любое количество элементов <add> с парами получаемых программно ключей и значений.
Для примера предположим, что имеется файл *.config. предназначенный для консольного приложения AppConfigReaderApp, в котором определены два касающихся конкретно этого приложения значения:
<configuration>
<appSettings>
<add key="TextColor" value="Green" />
<add key="RepeatCount" value="8" />
</appSettings>
</configuration>
Чтобы прочитать эти значения с целью использования в клиентском приложении, можно вызвать на уровне экземпляра метод GetValue(), который является членом типа System.Configuration.AppSettingsReader.