.NET is a Microsoft initiated set of ECMA standardized technologies commonly referred to as the Common Language Infrastructure (CLI). The specification consists of six partitions. Partition I: Concepts and Architecture, Partition II: Metadata Definition and Semantics, Partition III: CIL Instruction Set, Partition IV: Profiles and Libraries, Partition V: Binary Formats and Partition VI: Annexes.
The specification specifies a virtual execution service (VES). The VES is responsible for loading and running programs written for the CLI. It provides the services needed to execute managed code and data, using the metadata to connect separately generated modules together at runtime.
The Common Language Runtime (CLR) is Microsoft’s implementation of this VES.
Historically before .NET we had different programming languages with often a virtual machine for that language. So i.e., Pascal had a virtual machine, Scheme had a virtual machine and JavaTM had a virtual machine. My programming language, a virtual machine for that language.
.NET supports about 15-20 languages: C++, JavaTM, Pascal, Fortran, Cobol etc. So, it’s fairer to talk about .NET as a platform for running many different languages. However, there are some languages that stand out. C#, Visual Basic .NET and F# are a few Microsoft based languages that are widely used by millions of developers. These languages run on top of .NET, and as such produce what is known as managed code. Managed code because the CLR manages its lifetime and execution.
Types are at the heart of the CLI. They expose functionality to other types like types in your application. Types made by one .NET language will often be available and used by one or more types written in another .NET language. The formal specification of types is called the Common Type System (CTS), and it’s part of the CLI. Each programming language that compiles under the CLI uses a subset of the CTS that is appropriate for that language.