There are several different APIs for handling Types in .NET.
Criteria:For each category I want to call out:Managed/Unmanaged - is the API managed or unmanaged?Audience - who uses this API?Binding - A type is defined within a module. So how does it refer to types in different modules or types that haven't yet been loaded?Unloading - can you unload the modules you're inspecting types in? This is very related to the isolation between the host doing the inspection and the target that's being inspected.Generating code - can you use these inspection APIs to generate new code?
Conversions between APIs:Metadata is the fundamental type description in .NET, so converting between the type APIs will ultimately need to go through metadata. The non-metadata APIs have methods to convert to and from Metadata. For example, reflection exposes the tokens via the MemberInfo.MetadataToken property.