Während der Programmcode in klassischen ASP-Seiten interpretiert wird, kommen in ASP.NET Compiler zum Einsatz.

Grundlagen des Kompilierungsmodells

Das Kompilierungsmodell ist dabei seit ASP.NET 2.0 noch etwas komplexer als in ASP.NET 1.x, weil die Anforderung entstanden ist, dass in der Hintergrundcodeklasse kein vom Designer generierter Code enthalten sein soll. In ASP.NET 1.x musste dort jedes Steuerelement, das in der .aspx-Seite verwendet wurde, als Protected-Mitglied deklariert sein, damit der Programmcode in der Hintergrundcodeklasse die Mitglieder nutzen konnte. Visual Studio .NET 2002 / 2003 gelang es dabei nicht immer, die Steuerelemente und die Deklarationen konsistent zu halten. Außerdem machte das Modell das gemeinsame Arbeiten eines Layouters an der .aspx-Seite und eines Entwicklers an der Hintergrundcodedatei schwierig.

Ab ASP.NET 2.0 werden diese Protected-Mitglieder nun zur Übersetzungszeit aus der .aspx-Seite generiert. Die .aspx-Seite wird nicht wie bisher in genau eine Klasse umgewandelt, sondern es entstehen zwei Klassen:

  • Die erste Klasse (name_aspx) ist eine als partiell deklarierte Klasse. Sie enthält für jedes Serversteuer­element eine Protected-Mitgliederdeklaration. Diese Klasse bildet den Gegenpart zu der Klasse in der Hintergrundcodedatei (ebenfalls name_aspx), die daher auch immer als partiell deklariert sein muss.
  • In der zweiten Klasse (name_aspx) erzeugt das ASP.NET Page Framework Quellcode für alle HTML- und Server-Tags in der .aspx-Seite, d. h., der komplette Tag-Code wird in Programmcode umgesetzt. Diese Klasse erbt von der ersten Klasse und damit auch von dem in der Hintergrundcodedatei enthaltenen Gegenstück.

Da die Hintergrundcodeklasse von der in der FCL implementierten Basisklasse System.Web.UI.Page erbt, erbt folglich also indirekt auch die Klasse_name_aspx von der Page-Klasse. Die Klasse name_aspx wird dann in eine DLL übersetzt und kann von dem Webserver zur Erzeugung der Ausgabe an den Client aufgerufen werden.

Abbildung 4.7    Übersetzungsvorgang einer ASP.NET-Webseite

Autokompilierung

In Visual Studio .NET 2002 / 2003 wurden alle Hintergrundcodeklassen und eigenständigen Codedateien immer zur Entwicklungszeit in eine einzige .dll-Datei kompiliert. Diese Funktion entfällt im VWD: Der dortige Übersetzungsvorgang hat nur die Aufgabe, die Kompilierbarkeit zur Entwicklungszeit zu prüfen. Daher ist die Entwicklungskompilierung einer Webanwendung im VWD optional.

Das Standardübersetzungsmodell ab ASP.NET 2.0 ist die Kompilierung beim ersten Aufruf einer Website (Auto-Kompilierung, Ad-hoc-Kompilierung). ASP.NET 2.0 / 3.5 erzeugen pro Webseite eine Assembly beim ersten Aufruf. Alle Klassen, die nicht Hintergrundcodeklassen sind (also die Klassen im Verzeichnis /App_Code), werden in eine einzige separate Assembly kompiliert, sobald die erste Webseite in der Anwendung aufgerufen wird.

Präkompilierung

Das ASP.NET Page Framework 2.0 / 3.5 unterstützt die Möglichkeit, eine komplette ASP.NET-Weban­wendung inklusive der .aspx-Seiten zur Entwicklungszeit zu kompilieren und in diesem kompilierten Zustand auszuliefern. Die Präkompilierung erzeugt wahlweise

  • eine DLL-Assembly für die gesamte Webanwendung oder
  • eine DLL-Assembly für jede Webseite und eine DLL-Assembly für jede in /App_Code verwendete Programmiersprache.
  • Außerdem entsteht eine neue Konfigurationsdatei PrecompiledApp.config.

    Eine weitere Option betrifft die Auslieferung der .aspx-Dateien. Der Entwickler hat die Wahl:

  •   Die Webanwendung wird präkompiliert und die Inhalte der .aspx-Dateien werden zusätzlich mit ausgeliefert, sodass diese auf dem Zielsystem noch geändert werden können, wodurch eine Ad-hoc-Neukompilierung der geänderten Seite angestoßen würde. In der Wortwahl von ASP.NET 2.0 / 3.5 heißt diese Option Aktualisierbare, präkompilierte Webanwendung.
  •   Die Webanwendung wird präkompiliert und die Inhalte der .aspx-Dateien werden nicht an das Zielsystem übergeben. Der Empfänger kann also das Layout nicht ändern. Dies ist die beste Option zum Schutz des geistigen Eigentums und zum Schutz vor ungewollten Eingriffen der Empfänger. In der Wortwahl von ASP.NET 2.0 / 3.5 heißt diese Option Nicht aktualisierbare, präkompilierte Webanwendung. Auch die ASPX-Dateien sind noch in der Ausgabe enthalten, jedoch fehlt der eigentliche Code. Stattdessen enthalten alle Dateien nur noch den Satz: »This is a marker file generated by the precompilation tool, and should not be deleted!«. Die .aspx-Dateien dienen also dem Webserver nur als Markierungsdateien und zur Aufrechterhaltung der NTFS-Dateisystemrechte.

Der VWD stellt die Präkompilierung im Menüpunkt Erstellen/Website veröffentlichen (Build/Publish Website) bereit (gilt leider nicht für Visual Web Developer Express). Im Gegensatz dazu kopiert Website/Website kopieren (Website/Copy WebSite) nur Dateien auf ein Zielsystem oder einen Zielpfad. Bei der Nutzung von Erstellen/Website veröffentlichen style='letter-spacing:-.1pt'> lässt sich über das Kontrollkästchen Aktualisierbarkeit dieser vorkompilierten Site zulassen (Allow this precompiled website to be updateable) die Aktualisierbarkeit steuern.

An der Kommandozeile kann das Werkzeug aspnet_compiler.exe verwendet werden.

Der nachfolgende Befehl kompiliert den Inhalt eines Verzeichnisses im Dateisystem und speichert das Ergebnis in einem anderen Verzeichnis.

aspnet_compiler -v -c -p H:\WWW\WorldWideWings\WebUI_CSVB\
H:\WWW\WorldWideWings\WebUI_CSVB_Compiled –f -u

In der nachstehenden Variante wird als Quelle ein IIS-Anwendungsverzeichnis verwendet.

aspnet_compiler /v /LM/W3SVC/1/Root/WebUI_CSVB H:\WWW\WorldWideWings\WebUI_CSVB_Compiled –f -u

Die Option –f bedeutet, dass ein eventuell vorhandener Inhalt des Zielverzeichnisses überschrieben wird. Die Option –u steuert die Aktualisierbarkeit.

Verbreitung von Anwendungen

Aus den vorgenannten Kompilierungsoptionen ergeben sich nachstehende Optionen für die Auslieferung einer Anwendung (Deployment):

  • Auto-Compilation: Die Anwendung wird komplett mit allen Dateien (auch den Hintergrundcode­dateien und Dateien in /App_Code) auf das Zielsystem kopiert und dort beim ersten Aufruf übersetzt.
  • Pre-Compilation: Es werden nur der Inhalt des /bin-Verzeichnisses, die .aspx-, .ascx-, .asmx- und .asax-Dateien, die .config-Dateien sowie alle statischen Inhalte kopiert.

TIPP
Wenn Sie eine präkompilierte ASP.NET 2.0 / 3.5-Webseite aufrufen und dann nur die Meldung »This is a marker file generated by the precompilation tool, and should not be deleted!« sehen, haben Sie in der IIS-Konfiguration für dieses Web versehentlich die ASP.NET-Versionen 1.0 oder 1.1 ausgewählt. Nur ASP.NET 2.0 / 3.5 kann diese Dateien verarbeiten.

Programmiersprachen

An dem komplexen Kompilierungsvorgang können Sie bereits erkennen, dass nicht jede .NET-Programmiersprache für ASP.NET verwendet werden kann, da neben dem Kommandozeilencompiler auch noch die Codegenerierung gewährleistet sein muss. Im .NET Framework 3.5 stellt Microsoft die Sprachen VB und C# zur Verfügung. Die ursprünglichen Pläne, auch C++ / CLI für Webprojekte zur Verfügung zu stellen, wurden nicht realisiert.

Während in ASP.NET 1.x in Visual Studio nur genau eine Programmiersprache pro Projekt erlaubt war, kann ab ASP.NET 2.0 aufgrund der getrennten Kompilierung nun jedes Webform eine andere Sprache verwenden.

HINWEIS
Es ist aber nicht möglich, die Sprache innerhalb eines Webforms zu wechseln. Sofern in der .aspx-Seite Inline-Programmcode zum Einsatz kommt, muss die dort verwendete Programmiersprache der in der Hintergrundcodedatei verwendeten Programmiersprache entsprechen.

Der Programmcode in einem Webprojekt, der nicht an ein Webform gebunden ist (also alle eigenständigen Codedateien im /App_Code-Verzeichnis), kann im Standard weiterhin nur eine einzige Sprache verwenden. Hier gibt es aber die Option, Unterverzeichnisse (mit Namen VB, JS und CS) zu bilden, sodass mehrere Sprachen erlaubt sind. Diese Sprachmischung muss in der web.config-Datei aktiviert werden.

<codeSubDirectories>
               <add directoryName="vb"/>
               <add directoryName="cs"/>
               <add directoryName="js"/>
</codeSubDirectories>

Listing 4.3    Aktivierung der Programmiersprachenmischung in /App_Code

Inhalt dieses Kapitels:


<< Trennung von Layout und Programmcode Steuerelement-Typen >>