Объяснять это гораздо лучше, используя доску и много времени, но я попробую.
.NET Компиляция / сборка => Преобразование C # / VB.NET кода в PE exe формат с MSIL в нем + некоторые хитрости для загрузки .NET Framework ( CLR ).
Windows распознает только PE формат исполняемых файлов. Но он не может запустить MSIL как есть. Таким образом, .NET exe загружается с помощью сборок .NET Framework (для JIT компиляции, GC и т. Д.) Как часть процесса компиляции / сборки. Это своего рода хитрость, чтобы обмануть ОС Windows. ОС запускает его как обычный процесс, но управление не передается вашему коду MSIL напрямую. Вместо этого он передается сборкам .NET CLR (которые являются обычными библиотеками машинного кода). Сборки .NET CLR затем запускают JIT , компилируя код MSIL, упакованный в exe , и принимают управление памятью и потоками.
Это недостающий элемент, с которым большинство начинающих разработчиков .NET путаются. Итак, простой трюк таков; .NET exe имеет дополнительный код начальной загрузки, который выполняется до того, как ваш MSIL достигнут. Все остальные вещи, такие как ASP.NET , WPF - это только те CLR dll , которые загружаются. И именно поэтому .NET exe намного медленнее, чем собственный C / C ++ exe.
Другие ваши вопросы
ILASM -> - это инструмент, который может читать exe-файлы .NET и отображать MSIL, который он содержит. Такие инструменты, как Reflector, могут даже преобразовать этот код MSIL обратно в C # / VB.NET
CLR -> - это те сборки, которые загружаются как часть процесса компиляции и загружаются в память по мере необходимости. Это то, что работает ваш код MSIL.
CTS -> это просто система типов, для которой вы пишете свой код