637
Загрузка.сборок
загрузка сборок
Как вы уже знаете, когда JIT-компилятор генерирует IL-код метода, он «смотрит»,
на какие типы есть ссылки в IL-коде. Далее во время выполнения JIT-компилятор
по таблицам метаданных
TypeRef
и
AssemblyRef
выясняет, в какой сборке опреде-
лен упоминаемый тип. Запись таблицы
AssemblyRef
содержит все части строгого
имени сборки. JIT-компилятор собирает все эти части — имя (без расширения
и пути), версию, региональные стандарты и открытый ключ — в строку, а затем
пытается загрузить сборку с таким именем в домен приложений (если она еще не
загружена). Если загружается сборка с нестрогим именем, идентификационная
информация представляет собой только имя сборки (без версии, региональных
стандартов и открытого ключа).
CLR пытается загрузить эту сборку, используя статический метод
Load
класса
System.Reflection.Assembly
. Этот метод описан в открытой документации, его
можно вызывать для явной загрузки сборки в свои приложения. Он представляет
собой CLR-эквивалент Win32-функции
LoadLibrary
. Метод
Load
класса
Assembly
существует в нескольких перегруженных версиях. Вот прототипы наиболее по-
пулярных из них:
public class Assembly {
public static Assembly Load(AssemblyName assemblyRef);
public static Assembly Load(String assemblyString);
// Менее популярные перегруженные версии не показаны
}
Внутренний код
Load
заставляет CLR применить к сборке политику привязки
версии с перенаправлением и ищет нужную сборку сначала в глобальном кэше
сборок (GAC), а затем последовательно в базовом каталоге приложения, каталогах
закрытых путей и каталоге, указанном в элементе
codeBase
конфигурационного
файла. Если методу
Load
передается сборка с нестрогим именем, он не применяет
к ней политику, и CLR не ищет ее в GAC. Найдя искомую сборку,
Load
возвращает
ссылку на объект
Assembly
, представляющий загруженную сборку. Если указанная
сборка не найдена, появляется исключение
System.IO.FileNotFoundException
.
ПриМеЧание
В.чрезвычайно.редких.ситуациях.может.потребоваться.загрузить.сборку,.скомпоно-
ванную.для.определенной.версии.Microsoft.Windows .В.этом.случае.при.определении.
идентификационной.информации.сборки.можно.указать.сведения.об.архитектуре.
процесса .Например,.если.в.GAC.хранятся.нейтральная.и.специализированная.(x86).
версии.сборки,.CLR.предпочтет.специализированную.версию.(см .главу.3) .Однако.
можно.заставить.CLR.загрузить.нейтральную.версию,.передав.в.метод.Load.класса.
Assembly.такую.строку:
"SomeAssembly, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=01234567890abcde, ProcessorArchitecture=MSIL"
На.момент.написания.этой.книги.CLR.поддерживает.четыре.возможных.значения.
параметра.ProcessorArchitecture:.MSIL.(Microsoft.IL),.x86,.IA64.и.AMD64
Do'stlaringiz bilan baham: |