Anwendungsszenarien für die Reflektionsausgabe
In diesem Abschnitt werden einige Szenarien, in denen Anwendungen die Reflektionsausgabe und dynamische Methoden verwenden, ausführlicher beschrieben.
Ausführen eines Skriptes in einem Webbrowser
In diesem Szenario lädt ein Webbrowser eine HTML-Seite, die ein Skriptprogramm enthält, und führt das Programm aus. Folgende Schritte werden ausgeführt:
Der Webbrowser startet das Skriptmodul in der Anwendungsdomäne des Webbrowsers.
Der Webbrowser extrahiert das Skript der HTML-Seite und gibt es an das Skriptmodul weiter.
Das Skriptmodul erstellt eine flüchtige dynamische Assembly.
Das Skriptmodul verwendet Reflektionsausgabe-APIs, um den Code in die dynamische Assembly auszugeben.
Ausführen eines Skriptes auf einer ASP.NET-Seite
In diesem Szenario öffnet ein Browser eine ASP.NET-Seite, die ein Skriptprogramm enthält. Das Programm wird auf dem Server kompiliert und ausgeführt. Folgende Schritte werden ausgeführt:
ASP.NET startet seine Anwendungsdomäne und das Skriptmodul, um das Programm zu kompilieren und auszuführen.
Das Skriptmodul erstellt eine dauerhafte dynamische Assembly und ein dauerhaftes dynamisches Modul in der dynamischen Assembly.
Das Skriptmodul kompiliert das Programm mithilfe von Reflektionsausgabe-APIs und gibt den Code im dauerhaften dynamischen Modul aus.
Der kompilierte Code wird ausgeführt und ein eval-Ausdruck angetroffen.
Das Skriptmodul erstellt ein flüchtiges dynamisches Modul in der dynamischen Assembly, um den Code für den eval-Ausdruck aufzunehmen.
Das Skriptmodul wertet den eval-Ausdruck aus, indem es das flüchtige dynamische Modul ausführt.
ASP.NET fordert das Skriptmodul an, um die dynamische Assembly und das dauerhafte dynamische Modul im Cache zu speichern, sodass das Skript nicht erneut kompiliert werden muss, wenn die Seite wieder aufgerufen wird.
Kompilieren eines regulären Ausdrucks mithilfe der Reflektionsausgabe
In diesem Szenario verwendet ein Compiler die Reflektionsausgabe, um einen regulären Ausdruck in Quellcode zu kompilieren. Der Benutzer kann deklarieren, welche regulären Ausdrücke kompiliert werden sollen. Folgende Schritte werden ausgeführt:
Der Compiler verarbeitet die erste Verwendung eines regulären Ausdrucks im Quellcode des Benutzers.
Der Compiler kompiliert den regulären Ausdruck mithilfe der Reflektionsausgabe in eine benutzerdefinierte Scannerklasse, da der Benutzer die Kompilierung des Ausdrucks angefordert hat. Der reguläre Ausdruck wird zuerst in die Opcodes des Compilers übersetzt. Eine Anweisung könnte z. B. lauten "versuche 0 oder mehr Treffer für den Buchstaben 'A' zu erhalten". Die Opcodes des regulären Ausdrucks werden anschließend in MSIL (Microsoft Intermediate Language) übersetzt. Der Compiler kann z. B. eine Schleife generieren, mit der alle Vorkommnisse des Buchstabens "A" durchlaufen werden.
Der Compiler speichert die kompilierte Scannerklasse für spätere Verwendung.
Der Compiler instanziiert die kompilierte Scannerklasse und führt den Code in der aktuellen Anwendungsdomäne aus.
Der Compiler verarbeitet eine darauf folgende Verwendung des gleichen regulären Ausdrucks im Quellcode des Benutzers.
Der Compiler ruft die kompilierte Scannerklasse für den regulären Ausdruck ab, instanziiert ihn und führt den Code in der aktuellen Anwendungsdomäne aus.
Zunächst geht die Systemleistung zurück, wenn die erste Instanz eines regulären Ausdrucks verwendet wird, da der Compiler den Ausdruck in eine Scannerklasse kompilieren muss. Nachfolgende Verwendungen des gleichen regulären Ausdrucks werden jedoch effizient ausgeführt. Für reguläre Ausdrücke, die häufig verwendet werden, ist die einmalige, durch die Kompilierung bedingte Herabsetzung der Systemleistung nicht von Bedeutung, da eine deutliche Verkürzung der Ausführungszeit möglich ist.
Siehe auch
Konzepte
Reguläre Ausdrücke von .NET Framework