|
Загрузка CLR (часть 2)
Основной поток процесса вызывает заглушку х8б. сразу передающую управление на _CorExeMain в MSCorEE.dll. _CorExeMain инициализирует CLR и смотрит на
CLR-заголовок исполняемой сборки, чтобы определить, какой управляемый метод, являющийся точкой входа, следует вызвать. Затем IL-код этого метода компилируется в собственные команды процессора, и CLR передает управление этому процессорному коду (используя основной поток процесса). С этого момента
идет выполнение управляемого кода приложения.
С управляемыми DLL ситуация аналогичная: при их создании компилятор/ком-
поновщик генерирует аналогичную 6-байтную заглушку в разделе . text РЕ-файла:
JMP .CorOllMain
Функция _ C o r D l l M a i n также импортируется из MSCorEE.dll, и, следовательно, в
разделе . idata DLL есть ссылка на MSCorEE.dll. Загружая DLL, Windows автоматически загружает MSCorEE.dll (если она еще не загружена), получает адрес функции _CorDllMain и подменяет 6-байтную заглушку JMP х8б в управляемой DLL. Поток, обратившийся к LoadLibrary для загрузки управляемой DLL, передает управление заглушке х8б в управляемой сборке DLL, и управление сразу же передается
функции _CorDllMain в MSCorEE.dll. _ C o r D l l H a i n инициализирует CLR (если она еще не была инициализирована для данного процесса), возвращает управление, и приложение может продолжать нормальную работу.
6-байгные функции-заглушки х86 нужны для работы управляемых сборок в
Windows 98/98 Second Edition/Me/NT 4/2000, потому что эти ОС стали поставляться
задолго до появления CLR. Заметьте: они рассчитаны именно па машины х86. При
переносе CLR на другие архитектуры они не будут работать корректно. Посколь-
ку Windows XP и семейство Windows .NET Server поддерживают архитектуры процессоров х86 и IA64, загрузчик этих ОС был изменен для работы с управляющими сборками, Когда к управляемой сборке обращаются в Windows XP/.NET Server (обычно через CreateProcess или LoadLibrary), загрузчик ОС определяет, содержит ли файл управляемый код, анализируя запись 14 заголовка РЕ-файла. Если эта запись отлична от 0, загрузчик игнорирует раздел импорта файла (.idata) и автоматически загружает MSCorEE.Ull в адресное пространство процесса. Затем выполняется переход па нужную функцию в MSCorEE.dll. Функции-заглушки на машинах с Windows XP/.NET игнорируются.
И последнее замечание об управляемых РЕ-файлах: в них всегда используется
формат 32-разрядных РЕ-файлов, а не 64-разрядных. В 64-разрядных системах
Windows загрузчик ОС определяет формат 32-разрядного РЕ-файла и создает 64-
разрядное адресное пространство.
Предыдущая стр.   
Оглавление   
Следующая стр.
Средняя оценка:     (1 - 1 голосов) Для оценки необходимо зарегистрироваться
Только зарегистрировавшиеся пользователи могут оставлять комментарии
|
|