Элемент ‹codeBase›
Элемент ‹codeBase›
Файлы конфигурации приложения могут также указать базовый программный код. С помощью элемента ‹codeBase› можно дать инструкцию среде CLR искать зависимые компоновочные блоки в указанных местах (например, в общей сетевой папке или в локальном каталоге вне каталога приложения клиента).
Замечание. Если значение, присвоенное в рамках элемента ‹codeBase›, указывает на удаленную машину, компоновочный блок будет загружен по требованию в специальный каталог структуры GAC, имеющий специальное название – кэш загрузки. Увидеть содержимое кэша загрузки можно с помощью gacutil.exe, указав при запуске этой утилиты опцию /ldl.
С учетом того, что вы уже знаете об установке компоновочных блоков в GAC, будет ясно, что компоновочные блоки, загружаемые с помощью элемента ‹codeBase›, должны быть строго именованными (в конце концов, как же иначе среда CLR смогла бы установить удаленные компоновочные блоки в структуру GAC?).
Замечание. Строго говоря, элемент ‹codeBase› можно использовать и для зондирования компоновочных блоков, которые не являются строго именованными. Однако в таком случае адрес компоновочного блока должен задаваться относительно каталога приложения клиента (в этом отношении данный элемент предлагает более широкие возможности, чем элемент ‹privatePath›).
Создайте консольное приложение с именем СodeBaseСlient, установите для него ссылку на CarLibrary.dll версии 2.0.0.0 и измените исходный файл так.
using CarLibrary;
namespace CodeBaseClient {
class Program {
static void Main(string[] args) {
Console.WriteLine("***** Забавы с CodeBase *****");
SportsCar с = new SportsCar();
Console.WriteLine("Создана спортивная машина.");
Console.ReadLine();
}
}
}
Поскольку библиотека CarLibrary.dll была установлена в структуру GAC, вы уже можете выполнить программу. Но для демонстрации применения элемента ‹codeBase› создайте новую папку на своем диске C (например, папку C:MyAsms) и поместите в эту папку копию CarLibrary.dll версии 2.0.0.0.
Теперь добавьте в проект CodeBaseClient файл App.config (в соответствии с инструкциями, предложенными в этой главе выше) и добавьте в этот файл следующее XML-содержимое (не забывайте о том, что ваше значение .publickeytoken будет другим, и вы можете выяснить его в структуре GAC).
‹configuration›
‹runtime›
‹assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"›
‹dependentAssembly›
‹assemblyIdentity name="SharedAssembly" publicKeyToken="191ebf55656e0a43." /›
‹codeBase version="2.0.0.0" href="href="file:///C:MyAsmsCarLibrary.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Как видите, элемент <codeBase> вложен в элемент <assemblyIdentity>, использующий атрибуты name и publicKeyToken для указания понятного имени компоновочного блока и соответствующего кода открытого ключа. Сам элемент <codeBase> указывает версию и (с помощью атрибута href) адрес загружаемого компоновочного блока. Если вы удалите CarLibrary.dll версии 2.0.0.0 из структуры GAC, этот клиент все равно будет выполняться успешно, поскольку среда CLR сможет найти внешний компоновочный блок в C:MyAsms.
Однако если вы удалите каталог MyAsms со своей машины, то клиент работать не сможет. Очевидно, что элементы <codeBase> (если таковые присутствуют) имеют преимущество по сравнению с проверкой GAC.
Замечание. Если размещать компоновочные блоки в случайных местах на машине, велика вероятность того, что у вас, в конце концов, возникнет необходимость воссоздания реестра системы (из-за соответствующих проблем DLL), поскольку при перемещении или переименовании папок, содержащих выполняемые двоичные файлы приложений, имеющиеся связи будут нарушаться. В связи с этим используйте <codeBase> с осторожностью.
Элемент <codeBase> может оказаться полезным при ссылках на компоновочные блоки, размещенные в сети на удаленной машине. Предположим, что у нас есть доступ к папке, размещенной по адресу http://www.intertechTraining.com. В таком случае для загрузки удаленного файла *.dll в кэш загрузки GAC на локальной машине следует изменить элемент <codeBase> так.
<codeBase version="2.0.0.0" href="http://www.IntertechTraining.com/Assemblies/CarLibrary.dll" />
Исходный код. Проект CodeBaseClient размещен в подкаталоге, соответствующем главе 11.