CLR (Common Language Runtime) là managed runtime của .NET, chịu trách nhiệm chạy mã đã biên dịch ra Intermediate Language (IL) và cung cấp các dịch vụ như garbage collection, quản lý bộ nhớ, kiểm tra type safety và xử lý exception.
Hãy hình dung CLR như lớp giám sát giữa mã của bạn và hệ điều hành. Bạn đưa assembly chứa IL và metadata, nó kiểm tra tính hợp lệ, biên dịch ra mã máy cho CPU hiện tại và giám sát để thu hồi tài nguyên an toàn.
Về cơ chế, các ngôn ngữ .NET như C#, F# đều biên dịch ra IL và metadata trong assembly (.dll/.exe) thay vì mã máy. Khi khởi chạy, CLR nạp assembly và verifier kiểm tra type safety theo Common Type System (CTS) để ngăn truy cập bộ nhớ sai kiểu. JIT compiler (hiện tại là RyuJIT) chuyển IL thành mã máy native theo nhu cầu và cache lại để lần gọi sau không biên dịch lại. Trong lúc chạy, CLR quản lý managed heap với GC theo generation để thu hồi đối tượng không còn tham chiếu, quản lý thread và exception, đồng thời hỗ trợ interop để gọi mã unmanaged. Nhờ IL, cùng assembly có thể chạy trên Windows, Linux, macOS nếu có runtime tương ứng.
Lỗi thường gặp là đồng nhất CLR với toàn bộ .NET, hoặc nghĩ GC giải phóng ngay khi biến ra khỏi scope. GC chỉ chạy khi có áp lực bộ nhớ hoặc đạt ngưỡng generation, nên tài nguyên unmanaged vẫn cần Dispose/using. Một nhầm lẫn khác là cho rằng JIT xảy ra lúc build; thực tế JIT xảy ra lúc runtime, khác với AOT như NativeAOT biên dịch trước khi chạy.
Lưu ý: Phân biệt CLR với BCL: CLR là engine thực thi, BCL là thư viện lớp cơ sở chạy trên CLR. Với .NET Framework, CLR chỉ chạy trên Windows; với .NET 5+ hiện nay, runtime dựa trên CLR đã hỗ trợ cross-platform.