Benar sekali mas. Bukan hanya .NET 2005, tapi all of .NET version could be decompiling :). Kenapa bisa seperti itu? Hal tsb sebenarmya merupakan implikasi dari adanya IL / MSIL yang merupakan independent machine code. Kita ketahui bahwa semua .NET language itu akan dikompilasi menjadi IL / MSIL, bukan langsung dikompilasi menjadi Binary Machine Code seperti misalnya aplikasi yang dibuat dengan menggunakan vb 6.0.
MSIL ini merupakan bahasa yang masih bisa dimengerti oleh manusia, karena MS pun yang membuatnya pasti memiliki dictionary dari arti kode yang terdapat didalam IL tersebut. IL code tersebut akan diubah menjadi binary machine code pada saat runtime, ketika sebuah code dieksekusi.
Jadi secara logikanya IL code tersebut dapat di konvert kembali menjadi bahasa .net asalnya (source code). Jadi perlu ditekankan sekali lagi, bahwa file .exe atau file .dll hasil kompilasi itu bukan bahasa binary, namun bahasa IL.
Untuk melihat IL code tersebut mas bisa menggunakan tools ILDASM.EXE dari Visual Studio Command Prompt. Lalu nanti akan muncul windows yang digunakan untuk melihat IL code tsb, anda cukup cari file .exe atau file .dll.
Lalu bagaimana caranya untuk memproteksi IL code tersebut agar tidak dapat di convert back to source code yang dapat dibaca oleh manusia? Jawabannya yaitu .NET Dotfuscator. Tools ini akan mengacak kode-kode yang terdapat didalam program menjadi kode-kode yang tidak memiliki makna sebenarnya. Misalkan saya memiliki sebuah fungsi yang bernama GetAllCustomers, maka setelah di dotfuscate fungsi tersebut akan diubah menjadi misalnya fungsi AX atau lainnya yang tidak memiliki makna.
Tools tersebut bukan artinya mencegah decompilasi assembly ke source code, hal tersebut masih dapat dilakukan namun nantinya source code tersebut sudah berisi nama-nama prosedur yang sudah saya jelaskan tadi di atas. Tools ini ada yang free dan ada yang berbayar, mas bisa googling dengan keyword .NET Obfuscator.