Your processor cannot understand C, C++ or Java. It can interpret a set of instructions called it's instruction set. Now, to get your job done, you need to use these instructions to convey your logic. But that would require you to write your programs in 0s and 1s. Since it's not really easy to program that way, high level languages were created. But still the processor couldn't interpret these high level languages. So the programs written in HLLs should be converted to instructions that the processor could understand. Compiler does this. When you write a program in C, a software called compiler (a C compiler in this case) converts the C program to machine code which could be run by the processor. The problem is there's not just 1 processor but there are many. So to compile a C program in UNIX, you need a different C compiler, and for Windows you need another. Also, to compile in Intel processor you need a different compiler and for Alpha you need another.
Sun brought the concept of Java Virtual Machine (JVM) wherein your java program is not compiled to machine code which can run only on the processor type where it was compiled, but it's compiled to "bytecode" which could be run on any machine! Of course this is possible only if the machine where you want the program to run has JVM
Now .NET is something similar to the JVM. Here the virtual machine is called the common language runtime(CLR). Also the programs compiled for the CLR could be run on any "Windows" system that has CLR. I haven't learnt .NET yet but it seems to be cool in the sense whether you write a program in C, or C++, or C#, or even ASP, they are compiled to the same intermediate code which could be run on the CLR! So you have choices. If you know visual basic but not C that wouldn't stop you from programming for the CLR. You can use the language of your choice but still run the programs as effectively as any other language for .NET.