.Net Infrastructure

Hello all,

I'm hoping someone can clarify the basics of the .Net infrastructure as it applies to programming.

Here's my understanding:
Whatever code you write to can either compile it straight out or you can compile it to IL. If you compile it to IL, it's completly human readable (and therefore probably a bad idea for distributing a product). You then ship that IL code out and the user executes that IL code via an interpreter.

If you fully compile your written code fully, then you're writing unmanaged code and you loose the benefit of garbage collection etc that the JIT compiler provides (and the JIT compiler is very much like the Java VM).

Can you please correct any misunderstandings that I have as well as suggest a good book so I can read further on this topic.