Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
So erstellen Sie das Beispiel mithilfe der Eingabeaufforderung
Öffnen Sie ein Eingabeaufforderungsfenster, und navigieren Sie zu einem der sprachspezifischen Unterverzeichnisse für das Beispiel.
Geben Sie je nach verwendeter Programmiersprache msbuild ReflectionEmitCS.sln oder msbuild ReflectionEmitVB.sln in der Befehlszeile ein.
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
Öffnen Sie Windows Explorer, und navigieren Sie zu einem der sprachspezifischen Unterverzeichnisse für das Beispiel.
Doppelklicken Sie je nach verwendeter Programmiersprache auf das Symbol für ReflectionEmitCS.sln oder ReflectionEmitVB.sln, um die Datei in Visual Studio zu öffnen.
Wählen Sie im Menü Erstellen die Option Projektmappe erstellen aus.
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
Öffnen Sie das Eingabeaufforderungsfenster, und navigieren zu dem Verzeichnis, das die neue ausführbare Datei enthält.
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
Weitere Ressourcen
Ausgeben von dynamischen Methoden und Assemblys
Generieren und Kompilieren von dynamischem Quellcode
Hinweis: