The answer above is for the current way .NET apps are typically built. I should also mention that MS is also doing some forays into ahead-of-time compilation of .NET IL languages (C#, VB.NET, F#, etc.) directly into native instructions for the target platforms. I don't know the quality of the generated code and whether that will also be as easy to reverse engineer, or if it will be comparable to the difficulty of reverse engineering other languages that eventually get compiled to native.