В другом файле той же сборки.
Исполняющая среда проверяет, что файл, на
который ссылаются, описан в таблице
FileRef
в манифесте текущей сборки.
При этом исполняющая среда ищет его в каталоге, откуда был загружен файл,
содержащий манифест сборки. Файл загружается, проверяется его хеш-код,
чтобы гарантировать его целостность, затем CLR находит в нем нужный член
типа, и исполнение продолжается.
В файле другой сборки.
Когда тип, на который ссылаются, находится в файле
другой сборки, исполняющая среда загружает файл с манифестом этой сборки.
Если в файле с манифестом необходимого типа нет, загружается соответствующий
файл, CLR находит в нем нужный член типа, и исполнение продолжается.
ПриМеЧание
Таблицы.метаданных.ModuleDef,.ModuleRef.и.FileDef.ссылаются.на.файлы.по.имени.
и.расширению .Однако.таблица.метаданных.AssemblyRef.ссылается.на.сборки.только.
по.имени,.без.расширения .Во.время.привязки.к.сборке.система.автоматически.до-
бавляет.к.имени.файла.расширение.DLL.или.EXE,.пытаясь.найти.файл.путем.проверки.
каталогов.по.алгоритму,.описанному.в.главе.2
Если во время разрешения ссылки на тип возникают ошибки (не удается найти
или загрузить файл, не совпадает значение хеш-кода и т. п.), выдается соответ-
ствующее исключение.
ПриМеЧание
При. желании. можно. зарегистрировать. в. вашем. коде. методы. обратного. вы-
зова.с.событиями.из.System AppDomain AssemblyResolve,.System AppDomain
ReflectionOnlyAssemblyRessolve.и.System AppDomain .TypeResolve .В.методах.обрат-
ного.вызова.вы.можете.выполнить.программный.код,.который.решает.эту.проблему.
и.позволяет.приложению.выполняться.без.выбрасывания.исключения
113
Как.исполняющая.среда.разрешает.ссылки.на.типы
В предыдущем примере среда CLR обнаруживала, что тип
System.Console
реа-
лизован в файле другой сборки. CLR должна найти эту сборку и загрузить PE-файл,
содержащий ее манифест. После этого манифест сканируется в поисках сведений
о PE-файле, в котором реализован искомый тип. Если необходимый тип содержится
в том же файле, что и манифест, все замечательно, а если в другом файле, то CLR
загружает этот файл и просматривает его метаданные в поисках нужного типа.
После этого CLR создает свою внутреннюю структуру данных для представления
типа и JIT-компилятор завершает компиляцию метода
Main
. В завершение процесса
начинается исполнение метода
Main
.
Рисунок 3.2 иллюстрирует процесс привязки к типам.
рис. 3.2.
.Блок-схема.алгоритма.поиска.метаданных,.используемых.CLR,.файла.сборки,.
где.определен.тип.или.метод,.на.который.ссылается.IL-код
Если какая-либо операция заканчивается неудачей, то выдается соответствую-
щее исключение.
Есть еще один нюанс: CLR идентифицирует все сборки по имени, версии, регио-
нальному стандарту и открытому ключу. Однако GAC различает сборки по имени,
версии, региональному стандарту, открытому ключу и процессорной архитектуре.
При поиске сборки в GAC среда CLR выясняет, в каком процессе выполняется при-
114
Do'stlaringiz bilan baham: |