Die ersten C#- Programme erstellen - Zusatzkapitel zu
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Datei: cs-msil.doc, Seite1 13. Oktober 2006 Zusatzkapitel zu Kapitel 3: I - Erste Schritte Die ersten C#- Programme erstellen Richtig einsteigen: Programmieren lernen mit Visual C# 2005 Website zum Buch: www.vsxpress.de Auf den folgenden Seiten dieses Zusatzkapitels finden Sie Informationen zur Programmerstellung und Ausführung im .NET Framework. Aus Platzgründen konnten diese Seiten leider nicht in der gedruckten Version des Buches enthalten sein. Wir wollten Ihnen die Infos aber nicht vorenthalten. Der nachfolgende Text war ursprünglich hinter Abschnitt 3.2 vorgesehen. Programmerstellung und -ausführung Als Sie nach dem Schreiben des ersten Visual C# 2005-Programms den Befehl Debuggen/Starten ohne Debuggen aufgerufen haben, erschien nach einem kurzen Moment ein Fenster mit der Eingabeaufforde- rung auf dem Bildschirm, in dem der Text »Hello World« angezeigt wurde. Was hierfür an Programm- code nötig ist, haben Sie im vorigen Abschnitt lesen können. In diesem Abschnitt werden wir untersu- 1
Datei: cs-msil.doc, Seite2 13. Oktober 2006 Kapitel 3 Die ersten C#-Programme erstellen chen, was in diesem kurzen Moment zwischen dem Drücken von Strg+F5 und dem Sichtbarwerden der Eingabeaufforderung hinter den Kulissen passiert. Wenn Sie bereits in einer anderen Programmiersprache programmiert haben, die nicht im .NET Frame- work ausgeführt wird, dann ist Ihnen der Begriff Compiler sicherlich geläufig. Bei Sprachen wie C wird ein Compiler verwendet, um den Quellcode eines Programms in den Maschinencode zu kompilieren (man kann diesen Vorgang auch als Übersetzen oder Konvertieren bezeichnen), der von dem Betriebs- system und dem Prozessor, der auf diesem Computer läuft, verstanden und ausgeführt werden kann. Auch bei Visual C# 2005 wird der Quellcode in den Binärcode übersetzt, der auf dem Computer ausge- führt werden kann, jedoch ist dies (wie auch bei allen anderen .NET-Progammiersprachen ein zweistufi- ger Prozess, den nachfolgende Abbildung illustriert. Microsoft Intermediate Quellcode Language (MSIL) Maschinencode C# Compiler Assembly JIT-Compiler 0101010 1100101 0010100 0111010 1010101 1010010 Compiler VB Common Language Runtime Abbildung: Vom Quellcode zum ausführbaren Programm. Prinzip der Programmausführung unter .NET Framework. Im ersten Schritt wird der Quellcode, der in einer .NET-Programmiersprache erstellt wurde, mit dem Compiler in ein Zwischenformat kompiliert, das Microsoft Intermediate Language (MSIL) genannt wird. Gleichgültig, ob es sich um eine Anwendung oder eine Bibliothek handelt, die Datei, die nach dem Kompilieren vorliegt, wird Assembly genannt. Der in einer Assembly enthaltene Code ist plattformu- nabhängig (also weder an ein bestimmtes Betriebssystem noch an einen bestimmten Prozessor gebun- den). In dem Moment, in dem das Betriebssystem eine Assembly lädt (und hierbei erkennt, dass es sich bei der Datei um eine .NET-Assembly handelt), wird die Kontrolle und die weitere Ausführung der Datei an die Ausführungsschicht von .NET, der Common Language Runtime übergeben. Eine Komponente der Common Language Runtime ist der Just-In-Time-Compiler (JIT-Compiler), der die Datei aus der MSIL in den betriebssystem- und prozessorabhängigen Maschinencode übersetzt, der dann (von der CLR verwaltet) auf dem Computer ausgeführt werden kann. Auch wenn dieses Verfahren auf den ersten Blick etwas umständlich erscheinen mag, so bietet es wichti- ge Vorteile: Es ist (endlich) ohne Probleme möglich, dass Komponenten eines Projekts in unterschiedlichen Programmiersprachen erstellt und verwendet werden können. So können Sie beispielsweise in ei- 2
Datei: cs-msil.doc, Seite3 13. Oktober 2006 Programmerstellung und -ausführung nem C#-Programm ohne Weiteres eine Bibliothek verwenden, die in Visual Basic .NET erstellt wurde. Das Format der Assemblies ist bei allen .NET-Programmiersprachen identisch. I - Erste Schritte Zu dem Zeitpunkt, zu dem die Assembly erstellt wird, muss nicht bekannt sein, welcher Prozessor im Zielcomputer installiert ist, auf dem die Anwendung ausgeführt wird. Der JIT-Compiler kann beim Programmstart aus dem gleichen MSIL-Code immer den für den jeweiligen Prozessor opti- malen Maschinencode erstellen. Es gibt auch Implementierungen von .NET für andere Zielplattformen als Microsoft Windows. So ist es möglich, das gleiche Programm auf unterschiedlichen Betriebssystemen einzusetzen. Weitere Ordner im Projektmappen-Explorer Werfen Sie nun einen Blick auf den Projektmappen-Explorer. Im oberen Bereich seines Fensters befin- den sich mehrere Schaltflächen, eine von ihnen zeigt alle Dateien im Projektmappen-Explorer an. Abbildung: Projektelemente, die normalerweise ausgeblendet sind, werden mit hellen Symbolen dargestellt, wenn Sie die Schaltfläche Alle Dateien anzeigen anklicken. Wenn Sie die Schaltfläche Alle Dateien anzeigen anklicken, werden auch die Projektelemente angezeigt, die normalerweise ausgeblendet sind oder die Sie aus dem Projekt ausgeschlossen haben. Uns soll hier der Knoten bin interessieren, da der Compiler beim Erstellen der Assemblies diese im Ordner bin ablegt. Der Knoten bin besitzt zwei weitere untergeordnete Knoten: Debug und Release. Der Ordner Debug enthält die Assemblies und Dateien, die zum Ausführen der Anwendung im Debugger benötigt werden, im Ordner Release befindet sich die Anwendung so, wie Sie sie an andere weitergeben können. Diese Ordnerstruktur finden Sie auch im Projektverzeichnis auf Ihrer Festplatte wieder. In Abbildung 3.7 ist der Knoten Debug geöffnet: dort sehen Sie als ein Element die Datei Hello- World.exe, dies ist die Debug-Version der Assembly des Beispielprogramms vom Anfang des Kapitels. 3
Datei: cs-msil.doc, Seite4 13. Oktober 2006 Kapitel 3 Die ersten C#-Programme erstellen Ein Blick auf den MSIL-Code Sie können sich den MSIL-Code, der vom C#-Compiler erstellt wurde, ansehen. Verwenden Sie hierzu das Tool ILDASM, bei dem es sich um einen sogenannten Disassembler handelt, also einem Werkzeug, das quasi den Vorgang der Kompilierung wieder rückgängig machen kann. 1. Achten Sie darauf, dass im Projektmappen-Explorer alle Dateien angezeigt werden und wechseln Sie in den Ordner bin\Debug (siehe auch vorigen Abschnitt). 2. Klicken Sie HelloWorld.exe mit der rechten Maustaste an und wählen Sie Öffnen mit. 3. Klicken Sie im Dialogfeld Öffnen mit auf Hinzufügen. Das Dialogfeld Programm hinzufügen er- scheint. 4. Klicken Sie die Schaltfläche mit den drei Auslassungspunkten an und wechseln Sie in den Ordner, in dem sich die Programmdateien von Visual C# 2005 Express Edition befinden (standardmäßig ist dies C:\Programme\Microsoft Visual Studio 8, siehe hierzu auch Abschnitt 2.3). Navigieren Sie wei- ter in den Unterordner SDK\v2.0\bin. 5. Markieren Sie das Programm ILDASM.EXE und schließen Sie mit Öffnen und OK alle geöffneten Dialogfelder. 6. Der Microsoft .NET IL-Disassembler wird gestartet und er lädt Ihre Anwendung HelloWorld.exe. 7. Öffnen Sie den Knoten HelloWorld und dann den Knoten HelloWorld.Program. Abbildung: Die Struktur der Assembly wird im NET IL-Disassembler dargestellt. Jede .NET-Assembly besitzt ein sogenanntes Manifest, in dem sich Informationen über die Assembly befinden. Hierzu gehören der Name der Assembly, die Versionsnummer der Assembly, die Versions- nummer des .NET Frameworks, für das die Assembly erstellt wurden, weitere Versionsinformationen (Hersteller, Copyright-Informationen usw.), Typen, die von der Assembly bereitgestellt werden und eine Liste anderer Assemblies, die von dieser Assembly benötigt werden. Ab dem Knoten HelloWorld finden Sie die mittlerweile bekannten Elemente wieder. HelloWorld als Name des Namensraums dieser Assembly, die Klasse Program (als HelloWorld.Program dargestellt und mit einem eigenen Symbol versehen), und unterhalb des Knotens HelloWorld.Program als einen Eintrag die Main-Methode der Klasse Program. 4
Datei: cs-msil.doc, Seite5 13. Oktober 2006 I - Erste Schritte Abbildung 3.1: Der MSIL-Code für die Klassenmethode Main. Wenn Sie das Element für die Main-Methode doppelt anklicken, öffnet sich das Fenster, das Sie in obige Abbildung sehen. Diese Methode ist als Einstiegspunkt gekennzeichnet (.entrypoint) und Sie sehen den MSIL-Code der Methode. (Der Einstiegspunkt ist der Programmcode, der nach dem Starten eines Pro- gramms als erster ausgeführt wird.) Auch ohne in die Tiefen von MSIL einzusteigen, lässt sich an der Abbildung gut erkennen, dass zuerst der Text Hello World geladen, und dann die Bibliotheksmethode System.Console.WriteLine aufgerufen wird, die die Zeichenkette ausgibt. Hinweis: Das Zauberwort heißt Reflektion Vielleicht fragen Sie sich, wie der IL-Disassembler an all diese Informationen herankommt. Das Zauberwort heißt Reflektion. Reflektion ist ein von der Common Language Runtime bereitge- stellter Mechanismus, mit dem über einen Satz von Bibliotheksmethoden verschiedene Infor- mationen aus einer Assembly abgerufen werden können. Reflektion kann auch auf die eigene Assembly angewendet werden. D. h. Sie können beispielsweise zur Laufzeit die exakte Versi- onsnummer und die Buildnummer abrufen, und diese ausgeben. Ein kleines Beispiel in einem der späteren Kapitel zeigt, wie dies funktioniert. 5
Sie können auch lesen