Подтвердить что ты не робот

Что произойдет, когда приложение .net запущено?

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

4b9b3361

Ответ 1

Хм, позвольте мне сделать снимок тоже.

  • Кто-то создает .NET-приложение на С#, или .NET Intermediate Language, или другой управляемый язык.

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

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

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

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

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

  • CorBindToRuntimeEx загружает правильную реализацию среды выполнения .NET(и возвращает указатель на COM-интерфейс, позволяющий вызывать эту среду выполнения .NET. Этот код загружается из DLL в% 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

Ответ 2

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

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