Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original
Dieser Artikel wurde noch nicht bewertet - Dieses Thema bewerten.

TypeBuilder.CreateType-Methode

Erstellt ein Type-Objekt für die Klasse. Nach dem Definieren von Feldern und Methoden für die Klasse wird CreateType aufgerufen, um das entsprechende Type-Objekt zu laden.

Namespace:  System.Reflection.Emit
Assembly:  mscorlib (in mscorlib.dll)
public Type CreateType()

Rückgabewert

Typ: System.Type
Gibt das neue Type-Objekt für diese Klasse zurück.
AusnahmeBedingung
InvalidOperationException

Der einschließende Typ wurde nicht erstellt.

- oder -

Dieser Typ ist nicht abstrakt und enthält eine abstrakte Methode.

- oder -

Dieser Typ ist keine abstrakte Klasse und keine Schnittstelle und verfügt über eine Methode ohne Methodenkörper.

NotSupportedException

Der Typ enthält ungültigen MSIL-Code (Microsoft Intermediate Language).

- oder -

Das Verzweigungsziel wird mithilfe eines Offsets von 1 Byte angegeben, die Entfernung des Ziels von der Verzweigung ist jedoch größer als 127 Bytes.

TypeLoadException

Der Typ kann nicht geladen werden. Er enthält beispielsweise eine static-Methode, die über die Aufrufkonvention HasThis verfügt.

Wenn es sich bei diesem Typ um einen geschachtelten Typ handelt, muss die CreateType-Methode für den einschließenden Typ aufgerufen werden, bevor sie für den geschachtelten Typ aufgerufen wird.

Wenn der aktuelle Typ von einem unvollständigen Typ abgeleitet ist oder unvollständige Schnittstellen implementiert, rufen Sie die CreateType-Methode für den übergeordneten Typ und die Schnittstellentypen auf, bevor Sie sie für den aktuellen Typ aufrufen.

Wenn der einschließende Typ ein Feld enthält, das ein als geschachtelter Typ definierter Werttyp ist (z. B. ein Feld, das eine als geschachtelter Typ definierte Enumeration ist), generiert ein Aufruf der CreateType-Methode für den einschließenden Typ ein AppDomain.TypeResolve-Ereignis. Die Ursache hierfür ist, dass das Ladeprogramm die Größe des einschließenden Typs erst bestimmen kann, wenn der geschachtelte Typ abgeschlossen ist. Der Aufrufer muss einen Handler für das TypeResolve-Ereignis definieren, um die Definition des geschachtelten Typs durch Aufruf von CreateType für das TypeBuilder-Objekt abzuschließen, das den geschachtelten Typ darstellt. Im Codebeispiel zu diesem Thema wird das Definieren eines solchen Ereignishandlers veranschaulicht.

Ein Typ wird nur einmal erstellt, wobei es keine Rolle spielt, wie oft die CreateType-Methode aufgerufen wird. Alle Aufrufe geben dasselbe Type-Objekt zurück.

Im folgenden Codebeispiel wird das Definieren eines Ereignishandlers für das AppDomain.TypeResolve-Ereignis veranschaulicht, um während eines Aufrufs von CreateType für den einschließenden Typ die CreateType-Methode aufzurufen.



using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
using System.Text;
using System.Resources;
using System.Collections;
using System.IO;

internal class NestedEnum {    
    internal static TypeBuilder enumType = null;
    internal static Type tNested = null;   
    internal static Type tNesting = null;

    public static void Main(String[] args) {
	AssemblyName asmName = new AssemblyName();
	asmName.Name = "NestedEnum";
	AssemblyBuilder asmBuild = Thread.GetDomain().DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
	ModuleBuilder modBuild = asmBuild.DefineDynamicModule("ModuleOne", "NestedEnum.dll");       

	// Hook up the event listening.
	TypeResolveHandler typeResolveHandler = new TypeResolveHandler(modBuild);
	// Add a listener for the type resolve events.
	AppDomain currentDomain = Thread.GetDomain();
	ResolveEventHandler resolveHandler = new ResolveEventHandler(typeResolveHandler.ResolveEvent);
	currentDomain.TypeResolve += resolveHandler;

	TypeBuilder tb = modBuild.DefineType("AType", TypeAttributes.Public);
	TypeBuilder eb = tb.DefineNestedType("AnEnum", TypeAttributes.NestedPublic | TypeAttributes.Sealed, typeof(Enum), null);
	eb.DefineField("value__", typeof(int), FieldAttributes.Private | FieldAttributes.SpecialName);
	FieldBuilder fb = eb.DefineField("Field1", eb, FieldAttributes.Public | FieldAttributes.Literal | 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 == null)
	    Console.WriteLine("NestingType CreateType failed but didn't throw!");	

	try {
	    tNested = eb.CreateType();
	    if (tNested == null)
		Console.WriteLine("NestedType CreateType failed but didn't throw!");	
	}
	catch {
	    // This is needed because you might have already completed the type in the TypeResolve event.
	}

	if (tNested != null) {
	    Type x = tNested.DeclaringType;
	    if (x == null)
		Console.WriteLine("Declaring type was null.");
	    else 
		Console.WriteLine(x.Name);
	}

	asmBuild.Save( "NestedEnum.dll" );

	// Remove the listener for the type resolve events.
	currentDomain.TypeResolve -= resolveHandler;
    }
}

// Helper class called when a resolve type event is raised.
internal class TypeResolveHandler 
{
    private Module m_Module;

    public TypeResolveHandler(Module mod)
    {
	m_Module = mod;
    }

    public Assembly ResolveEvent(Object sender, ResolveEventArgs args)
    {
	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 {
	    // 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;
    }
}
    


.NET Framework

Unterstützt in: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.
Fanden Sie dies hilfreich?
(1500 verbleibende Zeichen)

Community-Beiträge

HINZUFÜGEN
Microsoft führt eine Onlineumfrage durch, um Ihre Meinung zur MSDN-Website zu erfahren. Wenn Sie sich zur Teilnahme entscheiden, wird Ihnen die Onlineumfrage angezeigt, sobald Sie die MSDN-Website verlassen.

Möchten Sie an der Umfrage teilnehmen?
© 2013 Microsoft. Alle Rechte vorbehalten.