The .net reflector I had initially seen in the "useful programs" topic seems to be trial/pay only, and I wasn't really that happy with it anyways.
The best free decompiler I've found is jetBrains dotPeek (http://www.jetbrains.com/decompiler/). I've used it to reverse several iOS unity games so far (on my Jailed iPhone; I'll probably be writing up a guide on this).
The most important feature I'd like to make note of, is that you can really easily right click on anything in any source file, and have it show you exactly where it is declared, implemented, or show you a list of every single place that any source file is calling it. Find a save function using some encrypt() method? Right click on "encrypt", and you can jump straight to where its implemented and see exactly how its working. See a method calling out to the server? right click on it, and see every place the app is using it, so you know where to expect network communication and what you can expect it to be sending/receiving. Using a DES crypto on a save and need to find the pk/iv? right click the parameters in the call to figure out where the string constant was originally defined (usually in a header surrounded by other useful final strings).
This isn't limited to just the current source file. If you load the entire folder of unity dlls, it will check every source file in every single dll you have loaded, so there's no worries about whether all the code is in firstpass or not.