Reflection is the ability of the .NET framework to gather information (metadata) about assemblies, modules and types at runtime. It allows you also to dynamically create instances of types, invoke methods and access fields, properties and attributes.
System.Reflection.Emit is used to create types and modules at runtime. Developer should be familiar with Intermediate Language (IL) to create new types at runtime and save them in 'dll' or 'exe' format.
Reflection is primary used by various other components of .NET like .NET Remoting. Reflection can be used to in modular design paradigms ( extension based , add-on based applications) where the functionality of the application is extended by providing new modules for it. In .NET 4.0 this has been upgraded and it has the feature of DLR.