C# 언어로 이루어진 코드를 실행파일로 만들기 위해 빌드할 때 C# 코드는 CLI 사양을 준수하는 중간 언어(IL; Intermediate Language)로 컴파일 된다. 이 중간언어는 CPU가 바로 해석할 수 없기 때문에 가상 머신(VM; Virtual Machine)인 CLR이 CPU가 이해할 수 있도록 해석해주어야 한다
코드가 IL로 변환되면 다시 한번 프로그램에 사용되는 리소스와 함께 패키징 되어 어셈블리(Assembly)가 된다. C#에서의 어셈블리는 모든 프로젝트가 성공적으로 컴파일되면 컴파일러에서 자동으로 생성되는 파일인데, 동적 링크 라이브러리(DLL; Dynamic Link Library) 또는 실행파일(EXE; Executable)이다
C/C++를 컴파일하면 생성되는 어셈블리 언어와는 다른 개념이기 때문에 혼동되어서는 안된다
만들어진 C# 프로그램을 실행하면 어셈블리가 실행되며 CLR에 로드된다. CLR은 어셈블리 안에 존재하는 IL코드를 플랫폼에 따라 동적 변환 컴파일(JIT; Just IN Time Compilation) 혹은 정적 변환 컴파일(Ahead-Of-Time Compilation) 과정을 수행하여 네이티브 코드(Native Code)로 변환한다
그리고 변환된 네이티브 코드를 사용하여 프로세서가 주어진 명령을 처리한다