This article is pretty enlightening to the differences between JVM and CIL back when CIL and JVM started. One of the things that is weird, is that it is written by two Microsoft Employees, which already makes me recognize that there is some kind of bias here, but I'll try to keep myself neutral.
One of the really amazing things is that CIL was made for implementing a variety of languages, with that in mind, we can see why there is so many languages running in .net This is amazing!
I like how there are different types of pointers: transient pointers and managed pointers. So that we can specify exactly how to manage them.
I really like how there is metadata on the build, that allows to check for the SHA1 Integrity of the file, so that we can progress on different levels.
What is weird is that sometimes we don't see how amazing was the competition from microsoft to create C#, We hope and think that sometimes It'll be all right. But seeing into it's history, this was a quite complex platform to create in 2002, the creation of C#, was a major breakthrough for computer science.
One of the most important things I found about CLR runtime is that it can box and unbox variables natively.
The CLR provides built-in support for boxing and unboxing. A valuetype
"T can be turned into reference type object using the box T instruction, and back into a valuetype using the unbox T instruction." So this means that object encapsulation is supportes in the assambly, which for C# 1.0 is an amazing feature. If C# is so good, it is mostly due to the amazing assambler Microsoft build for dotnet.
I just hope C# gets more traction in the future.
Miller, Jim et all.Technical Overview of the Common Language Runtime. Retrieved from http://webcem01.cem.itesm.mx:8005/s201811/tc3048/clr.pdf