Шаг 4. Обнаружение сборки с помощью базы кода или проверки
После определения правильной версии сборки с помощью сведений, содержащихся в файлах конфигурации и в ссылке вызывающей сборки, и после проверки в глобальном кэше сборок (только для сборок со строгими именами) общеязыковая среда выполнения приступает к процессу обнаружения сборки. Процесс обнаружения сборки включает в себя следующие этапы:
Если элемент <codeBase> найден в файле конфигурации приложения, среда выполнения проверяет указанное местоположение. Если найдено совпадение, используется найденная сборка, и проверка не производится. Если сборка не найдена, происходит сбой запроса привязки.
Среда выполнения осуществляет проверку наличия связанной сборки, используя правила, описанные далее в этом разделе.
Примечание |
---|
Если в каталоге имеется несколько версий сборки и требуется сослаться на конкретную версию сборки, необходимо использовать элемент <codeBase> вместо атрибута privatePath элемента <probing>.Если используется элемент <probing>, среда выполнения останавливает проверку при первом обнаружении сборки, у которой совпадает упоминаемое в ссылке простое имя сборки независимо от того, является ли совпадение точным или нет.Если совпадение точное, найденная сборка используется.Если совпадение не является точным, проверка прекращается и привязка считается неудавшейся. |
Обнаружение сборки с помощью базы кода
Сведения базы кода могут предоставляться с помощью элемента <codeBase> в файле конфигурации. Эта база кода всегда проверяется, перед тем как среда выполнения пытается начать проверку связанной сборки. Если файл политики издателя, содержащий переадресацию конечной версии, содержит также элемент <codeBase>, используется этот элемент <codeBase>. Например, если в файле конфигурации приложения указан элемент <codeBase>, и файл политики издателя, переопределяющий сведения приложения, также содержит элемент <codeBase>, используется элемент <codeBase> из файла политики издателя.
Если совпадение не найдено в местоположении, заданном элементом <codeBase>, запрос привязки завершается неудачей и никакие дополнительные действия не предпринимаются. Если среда выполнения определяет, что сборка соответствует критерию вызывающей сборки, то используется эта сборка. Когда загружается файл, указанный заданным элементом <codeBase>, среда выполнения проверяет совпадение имени, версии, языка, региональных параметров и открытого ключа с соответствующими параметрами ссылки вызывающей сборки.
Примечание |
---|
Связанные сборки вне корневого каталога приложения должны иметь строгие имена и должны быть установлены в глобальном кэше сборок или заданы с помощью элемента <codeBase>. |
Обнаружение сборки с помощью проверки
Если в файле конфигурации приложения нет элемента <codeBase>, среда выполнения проверяет наличие сборки, используя перечисляемые ниже четыре критерия:
Базовая папка приложения, являющаяся корневым каталогом, в котором выполняется приложение.
Язык и региональные параметры, являющиеся атрибутом региональных параметров сборки, на которую ссылаются.
Имя, являющееся именем связанной сборки.
Атрибут privatePath элемента <probing>, который является определяемым пользователем списком подкаталогов в корневой папке. Это местоположение может быть задано в файле конфигурации приложения и управляемом коде с помощью свойства AppendPrivatePath для домена приложения. При указании в управляемом коде путь privatePath управляемого кода проверяется первым, а за ним следует путь, задаваемый в файле конфигурации приложения.
Проверка базовой папки приложения и каталогов языков и региональных параметров
Среда выполнения всегда начинает проверку с базы приложения, которая может представлять собой либо URL-адрес, либо корневой каталог приложения на компьютере. Если связанная сборка не найдена в базовой папке приложения, и не предоставлены сведения о языке и региональных параметрах, среда выполнения осуществляет поиск во всех подкаталогах с именем сборки. В число проверяемых каталогов входят следующие:
[базовая папка приложения] / [имя сборки].dll
[базовая папка приложения] / [имя сборки] / [имя сборки].dll
Если для связанной сборки определены сведения о языке и региональных параметрах, проверяются только следующие каталоги:
[базовая папка приложения] / [язык и региональные параметры] / [имя сборки].dll
[базовая папка приложения] / [язык и региональные параметры] / [имя сборки] / [имя сборки].dll
Проверка с помощью атрибута privatePath
Помимо подкаталогов языков и региональных параметров и подкаталогов, называемых по связанной сборке, среда выполнения проверяет также каталоги, задаваемые с помощью атрибута privatePath элемента <probing>. Каталоги, задаваемые с помощью атрибута privatePath, должны быть подкаталогами корневого каталога приложения. Проверяемые каталоги зависят от того, включены ли сведения о языке и региональных параметрах в запрос связанной сборки.
Среда выполнения останавливает проверку при первом обнаружении сборки, для которой найдено совпадение с приведенным простым именем сборки независимо от того, является ли совпадение точным или нет. Если совпадение точное, найденная сборка используется. Если совпадение не является точным, проверка прекращается и привязка считается неудавшейся.
Если сведения о языке и региональных параметрах включены, проверяются следующие каталоги:
[базовая папка приложения] / [binpath] / [язык и региональные параметры] / [имя сборки].dll
[базовая папка приложения] / [binpath] / [язык и региональные параметры] / [имя сборки] / [имя сборки].dll
Если сведения о языке и региональных параметрах не включены, проверяются следующие каталоги:
[базовая папка приложения] / [binpath] / [имя сборки].dll
[базовая папка приложения] / [binpath] / [имя сборки] / [имя сборки].dll
Примеры проверки
Заданы следующие сведения:
Имя связанной сборки: myAssembly
Корневой каталог приложения: http://www.code.microsoft.com
Значение элемента <probing> в файле конфигурации: bin
Язык и региональные параметры: de
Среда выполнения проверяет следующие URL-адреса:
http://www.code.microsoft.com/de/myAssembly.dll
http://www.code.microsoft.com/de/myAssembly/myAssembly.dll
http://www.code.microsoft.com/bin/de/myAssembly.dll
http://www.code.microsoft.com/bin/de/myAssembly/myAssembly.dll
Несколько сборок с одинаковыми именами
В следующем примере демонстрируется настройка нескольких сборок с одинаковыми именами.
<dependentAssembly>
<assemblyIdentity name="Server" publicKeyToken="c0305c36380ba429" />
<codeBase version="1.0.0.0" href="v1/Server.dll"/>
<codeBase version="2.0.0.0" href="v2/Server.dll"/>
</dependentAssembly>
Другие проверяемые местоположения
Местоположение сборки может быть также установлено с помощью контекста текущей привязки. Это чаще всего происходит, когда используется метод Assembly.LoadFrom, а также в сценариях COM-взаимодействия. Если сборка использует метод LoadFrom для ссылки на другую сборку, местоположение вызывающей сборки рассматривается как подсказка о месте, где искать связанную сборку. Если обнаружено совпадение, найденная сборка загружается. Если совпадение не обнаружено, среда выполнения продолжает поиск в соответствии с семантикой, а затем запрашивает установщик Windows о предоставлении сборки. Если не предоставлена сборка, соответствующая запросу привязки, выдается исключение. Это исключение равно исключению TypeLoadException в управляемом коде, если имелась ссылка на тип, или исключению FileNotFoundException, если загружаемая сборка не была найдена.
Например, если Assembly1 ссылается на Assembly2, и Assembly1 была загружена с веб-узла http://www.code.microsoft.com/utils, это местоположение рассматривается как подсказка о месте, где следует искать Assembly2.dll. Затем среда выполнения проверяет наличие сборки на веб-узлах http://www.code.microsoft.com/utils/Assembly2.dll и http://www.code.microsoft.com/utils/Assembly2/Assembly2.dll. Если Assembly2 не обнаружена в каком-либо из этих местоположений, среда выполнения запрашивает установщик Windows.
См. также
Основные понятия
Обнаружение сборок в среде выполнения
Шаг 1. Проверка файлов конфигурации
Шаг 2. Проверка наличия ранее связанных сборок