A .NET application is compiled into IL (intermediate language) during compile time and it is compiled into platform specific binary code during runtime by JIT (Just in time) Compiler. You can decompile IL code to get the source code of the assembly. This is achieved by System.Reflection namespaces and classes. So you can write your own de-compiler. However, there is no need to re-invent the wheel as there are great tools for de-compiling, including free and commercial ones. I won’t go deep to share all the details of the tools. Instead, I will just share some of your options:
.NET Reflector is one of the best de-compiler tools. Actually, it is not just a de-compiler. It has several features including debugging without source code and Visual Studio integration. Version 6 of the tool is free if you are an existing .NET Reflector user. New versions are commercial.
ILSpy is an open-source .NET assembly browser and decompiler. It does not have features such as Visual Studio integration or debugging but if your only need is to de-compile .NET assemblies, then you can give it a try. It is free.
Web site: http://wiki.sharpdevelop.net/ilspy.ashx
JustDecompile is also a free tool. It is currently beta but it did what it had to do during my tests. As in ILSpy, if you just need to de-compile .NET assemblies then you can test this tool as well. Commercial support is also available.