Technologiebeispiel für Reflektionsausgabe

Aktualisiert: November 2007

Dieses Beispiel veranschaulicht die Verwendung von Reflektionsausgabe. Bei Reflektionsausgabe handelt es sich um ein Laufzeitfeature, mit dem Code dynamische Assemblys, Module und Typen erstellen kann. Sie können Instanzen der zu verwendenden Typen dynamisch erstellen, oder Sie können die Reflektionsausgabe zum Generieren einer Assembly verwenden, die auf einem Datenträger als ausführbare Datei oder DLL gespeichert wird. Dieses Beispiel besteht aus zwei ausführbaren Dateien. Die erste ausführbare Datei, EmitAssembly.exe, generiert einen dynamischen Typ und testet ihn, oder sie generiert einen dynamischen Typ und speichert ihn als DLL auf einem Datenträger. Die zweite ausführbare Datei, TestEmittedAssembly.exe, testet die von EmitAssembly.exe ausgegebene Assembly einfach dynamisch. Der von EmitAssembly.exe ausgegebene Typ ist eine einfache Klasse mit dem Namen "HelloWorld", deren Konstruktor einen Zeichenfolgenparameter akzeptiert. Der Typ implementiert auch eine GetGreeting()-Methode, die die an den Instanzkonstruktor übergebene Zeichenfolge zurückgibt.

Informationen zur Verwendung der Beispiele finden Sie unter den folgenden Themen:

Download sample

So erstellen Sie das Beispiel mithilfe der Eingabeaufforderung

  1. Öffnen Sie ein Eingabeaufforderungsfenster, und navigieren Sie zu einem der sprachspezifischen Unterverzeichnisse für das Beispiel.

  2. Geben Sie je nach verwendeter Programmiersprache msbuild ReflectionEmitCS.sln oder msbuild ReflectionEmitVB.sln in der Befehlszeile ein.

  3. Erstellen Sie die Testassembly, indem Sie die EmitAssembly-Klasse kompilieren. Geben Sie je nach verwendeter Programmiersprache csc /target:library EmitAssembly.cs oder vbc /target:library TestEmittedAssembly.vb in der Befehlszeile ein. Die sich ergebende Ausgabedatei ist EmitAssembly.dll.

So erstellen Sie das Beispiel mithilfe von Visual Studio

  1. Öffnen Sie Windows Explorer, und navigieren Sie zu einem der sprachspezifischen Unterverzeichnisse für das Beispiel.

  2. Doppelklicken Sie je nach verwendeter Programmiersprache auf das Symbol für ReflectionEmitCS.sln oder ReflectionEmitVB.sln, um die Datei in Visual Studio zu öffnen.

  3. Wählen Sie im Menü Erstellen die Option Projektmappe erstellen aus.

  4. Erstellen Sie die Testassembly, indem Sie die EmitAssembly-Klasse erstellen. Erstellen Sie ein Projekt vom Typ Klassenbibliothek, und verwenden Sie dazu die Datei EmitAssembly.cs oder EmitAssembly.vb. Die sich ergebende Ausgabedatei ist EmitAssembly.dll.

So führen Sie das Beispiel aus

  1. Öffnen Sie das Eingabeaufforderungsfenster, und navigieren zu dem Verzeichnis, das die neue ausführbare Datei enthält.

  2. Geben Sie in der Befehlszeile EmitAssembly.exe und dahinter den Wert ein, der als Parameter übergeben werden soll.

Hinweis:

In dem Beispiel wird eine Konsolenanwendung erstellt. Sie müssen es in einem Eingabeaufforderungsfenster starten und ausführen, um die Ausgabe anzuzeigen.

Hinweise

Weitere Informationen zur Reflektionsausgabe finden Sie in den Kommentaren der Quellcodedateien.

Hinweis:

Mit dem Tool MsBuild werden zwei ausführbare Dateien erstellt: EmitAssembly.exe und TestEmittedAssembly.exe. Um jedoch die Datei TestEmittedAssembly.exe zu erstellen, muss der Compiler die Assembly "EmittedAssembly.dll" öffnen können, auf die verwiesen wird. Nach dem Erstellen von EmitAssembly.exe führt das MsBuild-Tool EmitAssembly mit dem Befehlszeilenparameter "2" aus, der angibt, dass das Beispiel die dynamische Assembly ausgeben soll.

Die ausführbare Datei EmitAssembly akzeptiert einen Befehlszeilenparameter, der angibt, welcher Test durchgeführt werden soll. Bei einem Wert von 1 gibt das Beispiel den dynamischen Typ in seine AppDomain aus, und die statischen Member im Beispiel werden getestet. Bei einem Wert von 2 gibt das Beispiel den dynamischen Typ in eine Assembly aus und speichert die Assembly in Form einer DLL- und einer MOD-Datei auf einem Datenträger. Anschließend können Sie TestEmittedAssembly.exe oder ILDasm.exe ausführen, um den ausgegebenen Code zu testen.

Beispiel:

TestEmittedAssembly.exe

ILDasm EmittedModule.mod

Bei einem Wert von 3 gibt das Beispiel den dynamischen Typ in eine Assembly und anschließend einen zweiten dynamischen Typ aus, der den Code des ersten dynamischen Typs testet.

Im Beispiel werden die folgenden Technologien und Klassen verwendet:

  • AppDomain – Im Beispiel wird der AppDomain-Typ verwendet, um in der AppDomain des Beispiels eine dynamische Assembly zu erstellen. Dies geschieht durch Aufrufen der DefineDynamicAssembly-Methode.

  • AssemblyBuilder – Wird zum Erstellen einer dynamischen Assembly verwendet. Damit kann eine Assembly für die sofortige Verwendung erstellt werden, oder eine dynamische Assembly kann in einer DLL- oder EXE-Datei gespeichert werden.

  • AssemblyName – Wird verwendet, um die eindeutige Identität einer Assembly zu definieren. Im Beispiel wird dieser Typ auf die einfachste mögliche Weise verwendet, indem der dynamischen Assembly der Textname "EmittedAssembly" zugewiesen wird.

  • ModuleBuilder – Wird verwendet, um in der dynamischen Assembly ein dynamisches Modul zu erstellen.

  • TypeBuilder – Wird zum dynamischen Erstellen eines Typs verwendet. Dieser Typ wird von Type abgeleitet. Von ihm können Instanzen vom Typ FieldBuilder, ConstructorBuilder und MethodBuilder angefordert werden. In diesem Beispiel wird mithilfe dieser Typen ein vollständiger Typ generiert.

  • FieldBuilder – Wird zum Erstellen eines Felds in einem dynamischen Typ verwendet.

  • ConstructorBuilder – Wird zum Definieren eines Konstruktors in einem dynamischen Typ verwendet.

  • MethodBuilder – Wird zum Definieren einer Methode in einem dynamischen Typ verwendet.

  • ILGenerator – Sowohl MethodBuilder als auch ConstructorBuilder implementieren die GetILGenerator-Methode. Diese Methode gibt eine Instanz des ILGenerator-Typs zurück, mit dem dynamisch MSIL-Code (Microsoft Intermediate Language) für einen Typ generiert wird.

  • Thread – Wird zum Abrufen einer Instanz des AppDomain-Typs für den aktuellen Thread verwendet.

Siehe auch

Referenz

AppDomain

AssemblyBuilder

AssemblyBuilderAccess

AssemblyName

ConstructorBuilder

FieldBuilder

ILGenerator

MethodAttributes

MethodBuilder

MethodInfo

ModuleBuilder

ResolveEventHandler

System.IO

System.Reflection

System.Reflection.Emit

System.Threading

TypeBuilder

Weitere Ressourcen

Reflektion

Ausgeben von dynamischen Methoden und Assemblys

Generieren und Kompilieren von dynamischem Quellcode

Behandeln und Auslösen von Ereignissen

Verwaltete und nicht verwaltete Ereignisse