Хм, позвольте мне тоже попробовать.
Кто-то создает приложение .NET на C #, или .NET «Промежуточный язык», или другой управляемый язык.
Компилятор для этого языка csc.exe (C #) или ilasm.exe (ассемблер байт-кода), или какой-либо другой, создает исполняемый файл PE. Исполняемый файл PE имеет особую структуру, которую заполняет компилятор или ассемблер. Это включает в себя:
- точка входа и
- список динамических библиотек, которые он использует (таблица IMPORT). Одна из этих библиотек - mscoree.dll
- много метаданных, включая целевую версию .NET runtime
Когда исполняемый файл щелкается, запускается из командной строки или выполняется из Win32 API, реализация загрузчика Windows (в NTDLL.dll) занимает
Код загрузчика отвечает за загрузку исполняемого файла в память, загрузку библиотек динамической компоновки, если это необходимо, сопоставление связанных библиотек в месте, куда исполняемый код может их достать, и обновление таблицы адресов импорта фактическими адресами подключенные библиотеки.
Как только все будет готово, загрузчик переходит к точке входа (я предполагаю, что некоторые махинации переключаются из пространства ядра в пространство пользователя или в защищенный режим, поскольку приложение работает в своих собственных защищенных 32 или 64). бит памяти). Точкой входа является mscoree.dll - механизм выполнения общих объектов .NET, который был только что отображен в памяти процессов. Я видел эту DLL, называемую загрузочной шайбой .NET, и она позволяет нескольким установкам .NET существовать на одном компьютере. Mscoree.dll - это библиотека, которую вы будете использовать, если встраиваете язык .NET в свое обычное приложение.
Mscoree.dll просматривает метаданные, загруженные из исполняемого файла PE, в частности заголовок CLR, и целевую версию среды выполнения .NET. От этого он может CorBindToRuntimeEx 2 до правильной версии CLR.
CorBindToRuntimeEx загружает правильную реализацию среды выполнения .NET (и возвращает указатель на интерфейс COM, позволяющий вызывать эту среду выполнения .NET. Этот код загружается из библиотек в% WINDIR% \ Microsoft.NET \ Framework \ v #####.
Я не уверен, кто на этом этапе, но, вероятно, mscoree shim использует указатель интерфейса .NET ICLRRuntimeHost для вызова методов для инициализации среды выполнения .NET, сборщика мусора, интерпретатора IL, интерфейсов JIT и IHostControl (что разрешить интерпретатору .NET общаться с процессом хостинга) и, в конечном счете, сказать интерпретатору начать выполнение кода IL вашего скомпилированного приложения.
(я многому научился, написав это - за ссылками лежит тонна информации, я, конечно, не прошел через все это!)
http://msdn.microsoft.com/en-us/library/xh0859k0.aspx
http://my.safaribooksonline.com/book/programming/microsoft-dotnet/0735619883/a-tour-of-the-clr-hosting-api/ch02lev1sec3
http://msdn.microsoft.com/en-us/magazine/bb985994.aspx