код превращается в IL, который уже будет превращаться в машинный по мере необходимости (см. JIT компиляцию). Т.е. по сути первый вызов метода будет происходить чуть дольше т.к. будет происходить оптимизация и компиляция IL кода под реальную аппаратную платформу. После чего все последующие вызовы будут выполняется быстрее. Если такой вариант по каким-то причинам не подходит - есть ngen который позволяет сразу скомпилировать код под известную платформу (выиграв на холодных запусках, по потеряв в переносимости). И в этом случае jit компиляция во время работы приложения уже выполнятся не будет.
В CLR не входит CIL?
не совсем понял вопрос. cil/msil/il - просто промежуточный в который превращается код на С#/F#/VN.NET/etc. Можно расценивать его как ассемблер для .нета. Мало того, никто не запрещает написать свой DSL, который будет генерировать IL, который в свою очередь будет работать везде где работает .нет
JIT запускается каждый раз при сборке проекта или только один раз чтобы запомнить архитектуру платформы?
оба варианта нет. jit компиляция = just-in-time и запускается прямо во время работы приложения. как-раз она и превращает IL код в нужный набор машинных кодов.