There's only really one place in the .NET framework where you have to know IL, the classes in the System.Reflection.Emit namespace. It lets you generate code on the fly, that can be useful in select cases.
The best way to get exposure to IL is through the Ildasm.exe tool, Reflector could work too. A very convenient way to run it is by adding it to the Tools menu. Tools + External Tools, Add.
- Title = Ildasm
- Command = c:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ildasm.exe
- Arguments = $(TargetPath)
- Initial directory = $(TargetDir)
You can now write some managed code, compile and quickly take a look at the generate IL. You'll find it pretty easy going if you've been exposed to machine code before. Just keep in mind that IL is untyped, the same opcode is used for any value type.
The next step is to take a look at how IL gets translated to machine code. Start debugging, right-click the code and choose Go To Disassembly. Beware that you won't look at the real machine code unless you run the Release build and enable JIT optimization. Tools + Options, Debugging, untick "Suppress JIT optimization on module load".