Что происходит при запуске приложения .net? - PullRequest
28 голосов
/ 07 июля 2011

Я давно занимаюсь разработкой приложений с использованием .net.Но я все еще не уверен, как CLR узнает, что приложение .net запущено.Есть ли как один экземпляр CLR для приложения?Я не думаю, что это может быть так, поскольку есть только один GC, который управляет всей памятью для всех приложений .net.CLR работает в фоновом режиме?Я в замешательстве.

Ответы [ 2 ]

43 голосов
/ 09 июля 2011

Хм, позвольте мне тоже попробовать.

  1. Кто-то создает приложение .NET на C #, или .NET «Промежуточный язык», или другой управляемый язык.

  2. Компилятор для этого языка csc.exe (C #) или ilasm.exe (ассемблер байт-кода), или какой-либо другой, создает исполняемый файл PE. Исполняемый файл PE имеет особую структуру, которую заполняет компилятор или ассемблер. Это включает в себя:

    • точка входа и
    • список динамических библиотек, которые он использует (таблица IMPORT). Одна из этих библиотек - mscoree.dll
    • много метаданных, включая целевую версию .NET runtime
  3. Когда исполняемый файл щелкается, запускается из командной строки или выполняется из Win32 API, реализация загрузчика Windows (в NTDLL.dll) занимает

  4. Код загрузчика отвечает за загрузку исполняемого файла в память, загрузку библиотек динамической компоновки, если это необходимо, сопоставление связанных библиотек в месте, куда исполняемый код может их достать, и обновление таблицы адресов импорта фактическими адресами подключенные библиотеки.

  5. Как только все будет готово, загрузчик переходит к точке входа (я предполагаю, что некоторые махинации переключаются из пространства ядра в пространство пользователя или в защищенный режим, поскольку приложение работает в своих собственных защищенных 32 или 64). бит памяти). Точкой входа является mscoree.dll - механизм выполнения общих объектов .NET, который был только что отображен в памяти процессов. Я видел эту DLL, называемую загрузочной шайбой .NET, и она позволяет нескольким установкам .NET существовать на одном компьютере. Mscoree.dll - это библиотека, которую вы будете использовать, если встраиваете язык .NET в свое обычное приложение.

  6. Mscoree.dll просматривает метаданные, загруженные из исполняемого файла PE, в частности заголовок CLR, и целевую версию среды выполнения .NET. От этого он может CorBindToRuntimeEx 2 до правильной версии CLR.

  7. CorBindToRuntimeEx загружает правильную реализацию среды выполнения .NET (и возвращает указатель на интерфейс COM, позволяющий вызывать эту среду выполнения .NET. Этот код загружается из библиотек в% WINDIR% \ Microsoft.NET \ Framework \ v #####.

  8. Я не уверен, кто на этом этапе, но, вероятно, 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

5 голосов
/ 07 июля 2011

Исполняемые файлы Windows: Переносимые исполняемые файлы , формат, который предоставляет Windows информацию, необходимую для загрузки и запуска программы. Когда Windows обнаруживает программу .NET, она загружает экземпляр CLR и передает выполнение программы новому экземпляру CLR. Каждая запущенная программа .NET размещается в своем собственном экземпляре CLR.

Процесс CLR загружает программу IL и компилирует ее в собственный код (JIT), затем выполняет код, заботясь об управлении памятью и сборке мусора для этой программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...