.NET code is not compiled into binary “machine” code. .NET code is intermediate code. Intermediate code is descriptive language that delivers instructions, for example “call this method” or “add these numbers”, to functions that are available in libraries or within remote components.
.NET code runs within a machine-independent runtime, or “execution engine,” which can be run on any platform—Windows, Unix, Linux, or Macintosh. So, regardless of the platform you’re running, you can run the same intermediate code. The drawback of this cross-platform compatibility is that, because intermediate code must be integrated with a runtime, it’s slower than compiled machine code.
.NET code calls basic Microsoft functionality that is available in .NET class libraries. These are the “base” classes. “Specific” classes, for creating Web applications, Windows applications, and Web Services are also available. In the runtime itself you also have some classes that are offered by Microsoft for building applications—all of this comprises the .NET Framework upon which intermediate code can be written using one of a number of available .NET-enabled programming languages.
It doesn’t matter which language is used to create the intermediate code that delivers instructions to the available classes through the .NET runtime—the resulting functionality is the same.