Где именно работает .NET Runtime (CLR), JIT Compiler?
Этот вопрос может показаться немного глупым или странным, но я слышал много о .NET CLR, компиляторе JIT и о том, как он работает blah blah blah... Но теперь мне интересно, где именно оно расположено или размещено.
Это -
- Хостинг в составе операционной системы Windows, когда мы действительно устанавливаем .NET Framework
ИЛИ
- Это часть некоторого .exe, который мы видим в диспетчере задач
Я ищу подробный ответ на это. Кто-то может задать этот вопрос как "Как операционная система Windows запускает/выполняет .NET Исполняемый внутри .NET Runtime?
Ответы
Ответ 1
где именно оно расположено или размещено
Это просто обычная DLL, вы найдете ее версию x86 в C:\Windows\Microsoft.NET\Framework\v4.0.30319\clrjit.dll. Версия x64 находится в каталоге Framework64. Версия .NET v2 имела другое имя, mscorjit.dll, найти его в каталогах v2.0.50727.
Он не "размещен" вообще, операционная система полностью не знает, что она существует. CLR знает, как его найти и загрузить. Обязательно так, что CLR решает, когда запускать программу. Он просто имеет имя DLL с жестким кодированием и использует LoadLibrary ( "clrjit.dll" ) для загрузки, GetProcAddress ( "getJit" ), чтобы получить функцию factory. То, что вы можете увидеть в исходном коде CoreCLR, хотя в этой версии CLR больше не является джиттером.
Вы также можете увидеть CLR с Explorer, опять же просто обычную DLL. Это clr.dll в версиях v4, mscorwks.dll и mscorsvc.dll в версиях v2. Два разных типа с разными сборщиками мусора, "wks" - это версия рабочей станции, "svc" - это версия сервера. Сравните с файлом <gcServer>
config file.
Что задает вопрос: "Как загружается CLR?" Что задание c:\windows\syswow64\mscoree.dll, вы будете использовать c:\windows\system32\mscoree.dll, когда вы нацеливаете x64 в проект EXE. Каждая сборка .NET содержит 5 или 9 байтов неуправляемого кода, переход в эту DLL. Либо _CorExeMain, либо _CorDllMain, в зависимости от того, была ли сборка построена как exe или библиотека. mscoree.dll рассматривает метаданные в сборке и решает, какую версию CLR нужно загрузить, чтобы она могла быть выполнена надлежащим образом.
Продолжалось больше махинаций, я только что опубликовал 10 000 футов, которые вы просили. Если это вас интересует, вы, вероятно, захотите узнать больше о пользовательском хостинге CLR, чтобы увидеть человека за занавеской.
Ответ 2
Как операционная система Windows запускает/исполняет исполняемые программы .NET внутри .NET Runtime?
Каждая управляемая сборка или исполняемый файл .NET имеет специальные заголовки CLR, которые вы можете увидеть, просмотрев сборку в ILDASM. Эти заголовки указывают на версию среды выполнения, которая должна быть загружена. Кроме того, есть раздел изображения с Import Address Table
, указывающий на то, что нужно загрузить:
----- Image sections:
Import Address Table
DLL : mscoree.dll
0x00002000 Import Address Table
0x0000a37e Import Name Table
0 Time Date Stamp
0 Index of First Forwarder Reference
0x0000 _CorDllMain
----- CLR Header:
Header size: 0x00000048
Major runtime version: 0x0002
Minor runtime version: 0x0005
0x00003184 [0x00007078] address [size] of Metadata Directory:
Flags: 0x00000001
Entry point token: 0x00000000
0x00000000 [0x00000000] address [size] of Resources Directory:
0x00000000 [0x00000000] address [size] of Strong Name Signature:
0x00000000 [0x00000000] address [size] of CodeManager Table:
0x00000000 [0x00000000] address [size] of VTableFixups Directory:
0x00000000 [0x00000000] address [size] of Export Address Table:
0x00000000 [0x00000000] address [size] of Precompile Header:
При запуске операционной системы загружается mscoree.dll
(или The Shim), и это загрузочный файл для clr.dll
и clrjit.dll
для .NET 4.0 и выше, или mscordacwks.dll
и mscorjit.dll
для .NET 2.0 или ниже, которые являются средой выполнения и JIT, соответственно. Вы можете видеть, что для точки входа для исходной dll указывается метод _CorDllMain
для библиотеки классов и _CorExeMain
для исполняемого файла, который отвечает за загрузку и джиттинг точки входа. Они, в свою очередь, вызовут точку входа ваших приложений в управляемую среду.
Ответ 3
Это основано на моем понимании и направит вас к вам, но не может быть полностью очищено.
Файлы EXE/DLL, составляющие Runtime DotNet (CLR и т.д.), расположены в следующих местах:
C:\Windows\Microsoft.NET\Framework // for the 32 bit runtime
C:\Windows\Microsoft.NET\Framework64 // for the 64 bit runtime
Внутри вас есть разные версии, такие как 2.0.50727, 3.0, 3.5 и 4.0.30319 (версии в моей системе сегодня).
Здесь MSBuild, а также файлы, зарегистрированные в IIS, расположены и запускаются из.
Я не знаю, будет ли это размещено Windows во время выполнения, или если есть реальный EXE, с которым вы можете подключиться с помощью отладчика и увидеть его в диспетчере задач.
Надеюсь, это даст вам более глубокое понимание.