.net has one fundamental problem: MSIL.
I think that original design of .net was based on Java. JRE runs on multiple platforms so there is a need for some intermediate layer. However .net runs only on Windows (Mono is not a Microsoft product). I see absolutely no reason why .net has to have any intermediate languate or similar technology. Microsoft has no plans to move .net to other platform (OS X, Linux etc.) so what is MSIL for?
I hope that WinRT become new native .net framework and everything should be great. Maybe in the future we will get native c# (without MSIL), that would be even better.
The platform argument isn't as important as the hardware. MSIL allows the same binary to execute as x86-32, x86-64, IA64, PowerPC (XBox360/XNA) and ARM (Windows Phone 7 and Windows 8) without recompilation. A C++ application, even a WinRT Metro C++ application, will need to be recompiled to target each hardware platform*.
* Yes, I know that an x86-32 application will run just fine under WOW64 on 64-bit Windows, but it can't take advantage of the 64-bit platform by doing so.