Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как компиляться .NET-приложения 
V
    Опции темы
DjoNIK
Дата 25.2.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: нет
Всего: 5



Доброго времени суток!
Начал изучать .NET, сразу столкнулся с проблемой недопонимания процесса компиляции.
Как я понял все происходит так:
1) Исходный код на любом из CLI-языков компилиться в набор инструций IL.
2) Компилятор создает файл со стандартным PE-заголовком, точкой входа назначается метод Main().
3) Так как дальше идут не машинные команды, а IL-инструкции, то ставиться заглушка, вызывающая функцию jCorExeMain из mscoree.dll.
----Формирование OUT.exe/OUT.dll файла (это называется сборкой) завершено как я понимаю.
4) При вызове сборки из ОС инструкции доходят до вызова jCorExeMain и эта функция с помощью JITer-а компилирует IL-инструкций в машинные команды и сохраняется в ОП (и это происходит каждый раз, если машинных инструкций не находится в ОП).

Поправьте меня пожалуйста, если я что-то не так понимаю... или если я все понимаю не так... или если я, вдруг, все правильно понял сообщите об этом.


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
tol05
Дата 26.2.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



В принципе ты понял практически правильно, за исключением следующих моментов:

Цитата(DjoNIK @  25.2.2008,  22:19 Найти цитируемый пост)
2) Компилятор создает файл со стандартным PE-заголовком, точкой входа назначается метод Main().

Заголовок включает в себя (в дополнение к стандартному PE-заголовку OC) заголовок CLR.

Рихтера почитай, он все более-менее популярно описывает
Цитата

Загрузка CLR 
После анализа заголовка ЕХЕ-файла для выяснения того, какой процесс запустить — 32-, 64-разрядный или WoW64, Windows загружает в адресное пространство процесса соответствующую (х8б, хб4 или IA64) версию библиотеки MSCorEE.dll. ... Далее основной поток процесса вызывает определенный в MSCorEE.dll метод, который инициализирует CLR, загружает сборку ЕХЕ, а затем ее метод точки входа (Main). На этом процедура запуска управляемого приложения считается завершенной. 
Когда неуправляемое приложение вызывает LoadLibrary, Windows автоматически загружает и инициализирует CLR (если это еще не сделано) для обработки  содержащегося в сборке кода. 


Цитата

Хостинг CLR 
.NET Framework работает поверх Microsoft Windows. Это значит, что .NET Framework построена на основе технологий, «понятных Windows». Для начала замечу, что все файлы управляемых модулей или сборок должны быть в формате Windows РЕ (portable executable) и являться исполняемыми файлами Windows или динамически подключаемыми библиотеками (DLL). 
В Microsoft сконструировали CLR в виде СОМ-сервера, содержащегося в DLL, то есть разработчики Microsoft определили для CLR стандартный СОМ-интерфейс и присвоили этому интерфейсу и СОМ-серверу глобально уникальные  идентификаторы (GUID). При установке .NET Framework СОМ-сервер, представляющий CLR, регистрируется в реестре Windows, как любой другой СОМ-сервер. Подробнее см. заголовочный файл C++ MSCorEE.h из .NET Framework SDK — этот файл определяет все GUID и неуправляемый интерфейс ICorRuntimeHost. 
Любое приложение Windows может быть хостом CLR. Однако не следует создавать экземпляры СОМ-сервера CLR, вызывая CoCreatelnstance, вместо этого неуправляемый хост должен вызывать функцию CorBindToRuntimeEx или ее аналог (ее прототип хранится в MSCorEE.h). Эта функция реализована в библиотеке MSCorEE.dll, которая обычно расположена в каталоге C:\Windows\System32. Эта библиотека служит согласователем (shim) — она не содержит СОМ-сервер CLR, a только определяет, какую версию CLR следует создать. 
...
При вызове функции CorBindToRuntimeEx ее параметры позволяют хосту указать нужную ему версию CLR, а также другие параметры. На основе заданных сведений о версии и кое-какой дополнительной информации, собранной ею самостоятельно (например, число процессоров и установленные версии CLR), CorBindToRuntimeEx определяет версию CLR для загрузки — согласователь может и не загрузить версию CLR, запрошенную хостом. 
Функция CorBindToRuntimeEx возвращает указатель на неуправляемый интерфейс 
ICorRuntimeHost. Вызывая методы этого интерфейса, хост-приложение может: 
- определять диспетчеры хоста, то есть сообщать CLR, что хост должен принимать участие в принятии решений касательно выделения памяти, планирования и синхронизации потоков, загрузки сборок и т. п. Хосту также могут понадобиться уведомления о начале и окончании сборки мусора, а также о таймауте определенных операций; 
- получать информацию о диспетчерах CLR, то есть запрещать CLR использовать определенные классы или члены. Кроме того, хост может указать, какой код можно, а какой нельзя отлаживать, а также какие методы вызывать при наступлении определенных событий, таких как выгрузка домена приложения, остановка CLR или исключение переполнения стека; 
- инициализировать и запускать CLR; 
- загружать сборку и выполнять ее код; 
- останавливать CLR, предотвращая дальнейшее выполнение управляемого кода в процессе Windows. 


а также это
и это


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
DjoNIK
Дата 26.2.2008, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: нет
Всего: 5



tol05, сапсибо!


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.