Three ways that .NET languages are compiled
* The economy JITer represents the bare minimum functionality needed to run a .NET application, It directly replaces each MSIL instruction with equivalent native code, doing no optimization, thereby consuming less overhead. It's meant for use on platforms where memory resources are at a premium.
* On the other hand, the normal JITer, which is the default runtime configuration, can perform quite a few on-the-fly optimizations to the code it produces. This gives .NET an advantage over a traditional precompiled language, which can't make anything but fairly gross assumptions about the platform its emitted code will be run on.
* Microsoft provides what is known by the somewhat redundant name of a Pre-JIT compiler (otherwise known as the Native Image Generator, hence the name Ngen.exe).