Элемент <codebase> и пространство имен System.Configuration

72

Элемент <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.

Пройди тесты
Лучший чат для C# программистов