Да, есть как 32-битный, так и 64-битный JITter. Какой код будет выполнять ваш код, зависит как от среды / процесса хоста, который загрузил CLR, так и от самой сборки.
Когда вы собираете свои сборки, вы можете выбрать, будет ли он нацелен на x86, x64 или «AnyCPU».
- AnyCPU будет работать как 32-разрядный в 32-разрядном и 64-разрядный в 64-разрядном.
- 32-разрядная будет работать как 32-разрядная на 32-разрядной и будет работать под WOW64 на 64-разрядной.
- 64-разрядная не будет работать под 32-разрядной, но будет работать как 64-разрядная на 64-разрядной.
Существует также случай «устаревших» сборок, которые были построены до того, как была введена эта возможность. Я считаю, что они действуют так же, как 32-разрядные.
Обратите внимание, что если ваша сборка имеет какие-либо 32-битные собственные зависимости, то вы также должны пометить ее как 32-битную, в противном случае она будет загружена как 64-битная в 64-битной среде и зависимости не загрузятся.
Чтобы ответить на ваши обновленные вопросы:
На 64-битных машинах будет установлена как 32-битная, так и 64-битная CLR. 32-битная версия необходима для запуска 32-битных сборок под WOW64. (Например, Visual Studio является 32-разрядным!)
32-бит может иногда работать быстрее, потому что указатели меньше, поэтому на них тратится меньше кеша / памяти. С другой стороны, 64-битный режим имеет больше регистров, доступных для использования JITter. Это зависит от характеристик кода.