Die ersten C#- Programme erstellen - Zusatzkapitel zu

Die Seite wird erstellt Hellfried Opitz
 
WEITER LESEN
Die ersten C#- Programme erstellen - Zusatzkapitel zu
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