Creates a Type object for the class. After defining fields and methods on the class, CreateType is called in order to load its Type object.
Assembly: mscorlib (in mscorlib.dll)
The enclosing type has not been created.
This type is non-abstract and contains an abstract method.
This type is not an abstract class or an interface and has a method without a method body.
The type contains invalid Microsoft intermediate language (MSIL) code.
The branch target is specified using a 1-byte offset, but the target is at a distance greater than 127 bytes from the branch.
The type cannot be loaded. For example, it contains a static method that has the calling convention HasThis.
If this type is a nested type, the method must be called on the enclosing type before it is called on the nested type.
If the current type derives from an incomplete type or implements incomplete interfaces, call the method on the parent type and the interface types before calling it on the current type.
If the enclosing type contains a field that is a value type defined as a nested type (for example, a field that is an enumeration defined as a nested type), calling the method on the enclosing type will generate a AppDomain.TypeResolve event. This is because the loader cannot determine the size of the enclosing type until the nested type has been completed. The caller should define a handler for the TypeResolve event to complete the definition of the nested type by calling on the TypeBuilder object that represents the nested type. The code example for this topic shows how to define such an event handler.
A type is created only once, no matter how many times the method is called. All calls return the same Type object.
The following code example shows how to define an event handler for the AppDomain.TypeResolve event, in order to call the method on a nested type during a call on the enclosing type.
Imports System Imports System.Reflection Imports System.Reflection.Emit Imports System.Threading Imports System.Text Imports System.Resources Imports System.Collections Imports System.IO Friend Class NestedEnum Friend Shared enumType As TypeBuilder = Nothing Friend Shared tNested As Type = Nothing Friend Shared tNesting As Type = Nothing Public Shared Sub Main() Dim asmName As New AssemblyName() asmName.Name = "NestedEnum" Dim asmBuild As AssemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave) Dim modBuild As ModuleBuilder = asmBuild.DefineDynamicModule("ModuleOne", "NestedEnum.dll") ' Hook up the event listening. Dim typeResolveHandler As New TypeResolveHandler(modBuild) ' Add a listener for the type resolve events. Dim currentDomain As AppDomain = Thread.GetDomain() Dim resolveHandler As ResolveEventHandler = AddressOf typeResolveHandler.ResolveEvent AddHandler currentDomain.TypeResolve, resolveHandler Dim tb As TypeBuilder = modBuild.DefineType("AType", TypeAttributes.Public) Dim eb As TypeBuilder = tb.DefineNestedType("AnEnum", TypeAttributes.NestedPublic Or TypeAttributes.Sealed, GetType([Enum])) eb.DefineField("value__", GetType(Integer), FieldAttributes.Private Or FieldAttributes.SpecialName) Dim fb As FieldBuilder = eb.DefineField("Field1", eb, FieldAttributes.Public Or FieldAttributes.Literal Or FieldAttributes.Static) fb.SetConstant(1) enumType = eb ' Comment out this field. ' When this field is defined, the loader cannot determine the size ' of the type. Therefore, a TypeResolve event is generated when the ' nested type is completed. tb.DefineField("Field2", eb, FieldAttributes.Public) tNesting = tb.CreateType() If tNesting Is Nothing Then Console.WriteLine("NestingType CreateType failed but didn't throw!") End If Try tNested = eb.CreateType() If tNested Is Nothing Then Console.WriteLine("NestedType CreateType failed but didn't throw!") End If Catch End Try ' This is needed because you might have already completed the type in the TypeResolve event. If Not (tNested Is Nothing) Then Dim x As Type = tNested.DeclaringType If x Is Nothing Then Console.WriteLine("Declaring type is Nothing.") Else Console.WriteLine(x.Name) End If End If asmBuild.Save("NestedEnum.dll") ' Remove the listener for the type resolve events. RemoveHandler currentDomain.TypeResolve, resolveHandler End Sub 'Main End Class 'NestedEnum ' Helper class called when a resolve type event is raised. Friend Class TypeResolveHandler Private m_Module As [Module] Public Sub New([mod] As [Module]) m_Module = [mod] End Sub 'New Public Function ResolveEvent(sender As [Object], args As ResolveEventArgs) As [Assembly] Console.WriteLine(args.Name) ' Use args.Name to look up the type name. In this case, you are getting AnEnum. Try NestedEnum.tNested = NestedEnum.enumType.CreateType() Catch End Try ' This is needed to throw away InvalidOperationException. ' Loader might send the TypeResolve event more than once ' and the type might be complete already. ' Complete the type. Return m_Module.Assembly End Function 'ResolveEvent End Class 'TypeResolveHandler