What is MSIL in .NET Framework?

06 September 2021 at 10:00 by ParTech Media - Post a comment

To construct programs, the.NET framework comes with individual compilers for different programming languages like C#.

After compiling the source code, each.NET compiler generates an intermediate code, and every environment uses this intermediate code known as Microsoft intermediate language (MSIL).

In this post, we will understand what is MSIL in detail, including its role and necessities.

Table of contents

  1. What is MSIL?
  2. Execution process in Common Language Runtime (CLR)
  3. Role of MSIL in a .NET environment
  4. Prerequisities
  5. MSIL Internals
  6. Final Words

What is MSIL Programming?

The Microsoft Intermediate Language (MSIL) also goes by the name Common Intermediate Language (CIL). It is typically a set of platform-independent instructions created from source code by a language-specific compiler.

It is produced by a variety of compilers (C#, VB,.NET, and so on). The ILDasm (Intermediate Language Disassembler) software included in the.NET Framework SDK (FrameworkSDKBinildasm.exe) allows users to view MSIL code in a human-readable format. We may view MSIL code in any.NET executable file (EXE or DLL) using this application.

MSIL is machine agnostic and may be turned into native code quickly. A just-in-time (JIT) compiler is included in the CLR, which turns MSIL code into native machine code. As a result, MSIL must be translated by a JIT compiler before being executed on the CPU. For each supported machine architecture, a JIT compiler is available. Any supported machine will run the same MSIL.

Execution process in Common Language Runtime (CLR)

The following is the execution process, which comprises the production of the MSIL and the JIT compiler's conversion of the MSIL to machine code:

  • During the CLR's compile-time, a language-specific compiler converts the source code to MSIL. In addition to the MSIL, metadata is generated during the compilation. The metadata includes elements like the definition and signature of the types in the code, as well as runtime information.
  • The MSIL is assembled into a Common Language Infrastructure (CLI) assembly. This assembly is a built code library used for security, deployment, versioning, and other purposes. It is divided into two types: process assembly (EXE) and library assembly (LIB) (DLL).
  • The JIT compiler then translates the Microsoft Intermediate Language (MSIL) into machine code that is related to the computer environment in which it executes. The MSIL is transformed to machine code on a requirement-by-requirement basis, which means that the JIT compiler only compiles the MSIL that is necessary rather than the entire MSIL.
  • The JIT compiler generates machine code, which is subsequently executed by the computer's CPU.

Role of MSIL in a .NET environment

Following are the roles of MSIL in .NET environment:-

  1. Platform Independence:- Platform independence means that the identical byte code instruction file may be placed on any platform; the last stage of compilation can then be simply completed at runtime so that the code can execute on that platform. To put it in another way, MSIL defines a set of portable instructions that are not dependent on a particular CPU.
  2. Performance Improvement:- Rather than building the entire application at once, the JIT compiler merely compiles each section of code as needed. When the code is compiled once, the resulting native executable is saved until the application is created, so it doesn't have to be recompiled the next time that section of the code is run. This method is faster than compiling the complete program code from the beginning. It also demonstrates that running MSIL code is nearly as quick as running native machine code.
  3. Language Interoperability:- Language interoperability is aided by the usage of MSIL. One can compile to MSIL from one language, and the resulting code is compatible with code (compiled to MSIL) from another language. In other words, the MSIL design allows the framework to be language agnostic. Language selection is no longer controlled by the developers. Even multiple languages can be used in a single program.
  4. Reducing maintenance headaches:- The CLR can examine the MSIL code to see if it complies with standards like type safety. Buffer overflows and unsafe casts can be identified at build time, decreasing maintenance headaches significantly.


Because CIL developers are directly confronted with CLR's built-in grammar, programming with CIL might be difficult. Instead of the more user-friendly languages such as C#, F#, and VB.NET (which use a more English-like language syntax), opcodes are used. When programming CIL directly, it is recommended that you have the following tools installed.

  • Visual Studio IDE 2010, or later
  • .NET Framework 4.0, or later
  • ILDASM.EXE, ILASM.EXE utilities
  • Notepad++
  • SharpDevelop (optional)
  • Xamarin Studio (optional)

Although CIL code can be written in a simple notepad editor, it is advised that you use a full-featured editor like SharpDevelop to develop CIL code.

MSIL Internals

CIL code is conceptually comparable to Java bytecode because it is not compiled to platform-specific instructions until absolutely necessary. For each CPU targeting the runtime, the.NET CLR uses a JIT compiler that is optimized for the underlying platform. The metadata in.NET binaries describe the characteristics of each type contained within the binary.

The metadata, formally known as a manifest, constitutes information on the current version of the assembly, as well as lists of all externally linked assemblies and culture data.

Rather than compiling directly to a specific instruction set, each of the.Net permitted programming source codes is finally compiled into CIL. Because of this, all the .NET-supported languages can communicate with one another. Furthermore, the CIL code delivers the same advantages that Java programmers have come to expect.

The keywords in each.NET supported programming language are mapped to CIL mnemonics. When loading a string variable into memory, you can utilize the opcode ‘ldstr’ instead of StringLoading.

Final Words

MSIL code is the foundation of every.NET assembly. The more you learn about MSIL instruction sets, the better you'll be able to understand advanced.NET application development.