Many of the services available in .NET and exposed via C# (such as late binding, serialization, remoting, attributes, etc.) depend on the presence of metadatas. Your own programs can also take advantage of this metadata, and even extend it with new information.
Manipulating existing types via their metadata is termed
reflection and is done using a rich set of types
System.Reflection namespace. Creating new
types (and associated metadata) is termed
Reflection.Emit, and is done via the types in the
System.Reflection.Emit namespace. You can extend
the metadata for existing types with custom attributes. For more
information, see Section 3.11.
Reflection involves traversing and manipulating an object model that represents an application, including all its compile-time and runtime elements. Consequently, it is important to understand the various logical units of a .NET application and their roles and relationships.
The fundamental units of an application are its types, which contain
members and nested types. In addition to types, an application
contains one or more modules and one or more assemblies. All these
elements are static and are described in metadata produced by the
compiler at compile time. The one exception to this rule are elements
(such as types, modules, assemblies, etc.) that are created on the
Reflection.Emit, which is described in Section 3.10.8.
At runtime, these elements are all contained within an
AppDomain isn’t described ...