Arbeiten mit .NET: Allgemeines/ Entwicklungsumgebungen/ MS Visual Studio

Aus Wikibooks
Dieses Kapitel beschreibt für Microsoft Visual Studio spezifische Vorgehensweisen. Nutzer einer anderen IDE richten sich bitte nach den Informationen in SharpDevelop oder MonoDevelop.
Wikipedia hat einen Artikel zum Thema:


Eine komfortable IDE[Bearbeiten]

Microsoft Visual Studio (auch als VS abgekürzt) ist eine vollständige IDE (Integrated Development Environment, also Integrierte Entwicklungsumgebung) und bietet alles, was das Programmieren erleichtert:

  • Syntax-Hervorhebung
  • Code-Vervollständigung
  • Zusammenfassung mehrerer Quelltexte zu Projekten
  • schneller Wechsel zum Compiler mit Debugger
  • integrierte Hilfe zum .NET Framework

Visual Studio steht als professionelles Werkzeug (mit unterschiedlichem Umfang) zur Verfügung. Es ist auch als kostenlose Community-Version erhältlich.

Installation und Einrichtung[Bearbeiten]

Visual Studio glänzt durch eine relativ autonome Installationsroutine, die, soweit noch nicht vorhanden, auch den nötigen Unterbau installiert, vor allem das .NET-Framework, auf Wunsch aber auch nützliche Zusätze wie z.B. die Microsoft SQL Server 2008 Express Edition, die für Datenbankprogrammierung unerlässlich ist.

Achtung: Wenn Sie planen, Visual Studio und SharpDevelop parallel zu installieren, empfehlen wir Ihnen dringend, zuerst das für Sie "unwichtigere" Programm zu installieren. Durch die folgende Installation werden unter Umständen die Dateizuordnungen der ersten Installation beschädigt. Bei einer Installation beider IDE gilt deshalb: immer erst die Zweitumgebung und dann die Hauptentwicklungsumgebung installieren.

Einstellungen[Bearbeiten]

Wie jedes andere Programm muss auch VS nach dem ersten Start an die persönlichen Bedürfnisse angepasst werden, um ein zügiges Arbeiten zu ermöglichen. Dazu öffnen Sie den Optionsdialog im Menü Extras. Wählen Sie zunächst (links unten) Alle Einstellungen anzeigen und legen fest:

  • Unter Projekte und Projektmappen legen Sie ein Standardverzeichnis für Ihre Projekte fest und steuern, ob ein neues Projekt sofort zu speichern ist.
  • Auch unter Erstellen und Ausführen sollten Sie "Vor Erstellen: Alle Änderungen speichern" wählen.
  • Unter Umgebung > Start steuern Sie, ob die zuletzt bearbeitete Projektmappe stets aktiviert werden soll oder ob stattdessen die Startseite anzuzeigen ist.
  • Unter Umgebung > Hilfe > Online regeln Sie, wo und wie Hilfe-Informationen gesucht werden sollen.
  • Unter Text-Editor > Alle Sprachen sollten unter Anzeigen die Zeilennummern aktiviert werden.

Alle anderen Optionen können Sie sich einmal ansehen und später bei Bedarf anpassen. Bestätigen Sie die Festlegungen mit OK.

Die Oberfläche[Bearbeiten]

Der größte Teil des Bildschirms wird vom Hauptfenster eingenommen. Es enthält ggf. die Startseite mit den zuletzt bearbeiteten Projekten und während der Laufzeit die geöffneten Dokumente. Dieses Hauptfenster wird eingerahmt von verschiedenen zusätzlichen Informationen und Fenstern zur Auswahl:

  • Links finden Sie:
    • die Toolbox (Auswahl an Werkzeugen), die bei WinForms-Anwendungen auch die Controls anbietet
    • den Datenbank-Explorer mit der Liste der Datenverbindungen
  • Rechts finden Sie:
    • die Übersicht der Projektmappen mit allen ihren Informationen
    • die Übersicht der Klassen einer Projektmappe
    • die Eigenschaften, vor allem wenn ein Formular in der Designer-Ansicht geöffnet ist
  • Unten finden Sie:
    • Fehlermeldungen und Warnungen
    • Aufgaben, die in verschiedenen Programmteilen zu erledigen sind
    • Ausgabe während des Programmablaufs
    • Lokale Variable zum Debuggen während des Programmablaufs

Diese Fenster kann man bei Bedarf ein- und ausblenden. Im ausgefahrenen Zustand findet sich im Titel eines solchen Fensters neben dem obligatorischen X zum Schließen eine Pinnnadel. Ein Klick stellt sie auf und verhindert, dass das Fenster automatisch ausgeblendet wird; ein erneuter Klick hebt diese Verankerung auf. Im Menü Ansicht können Sie diese Fenster nach Bedarf öffnen.

Im Untermenü Ansicht > Symbolleisten können Sie Symbolleisten auswählen. Sehr nützlich sind neben Standard die Symbolleisten Erstellen und Debuggen. Wie in Microsoft Office können die Symbolleisten verschoben und in mehreren Reihen angeordnet werden.

Ein erstes Projekt[Bearbeiten]

Hello World[Bearbeiten]

Das einfachste Programm ist ein Hello World-Programm, das lediglich diesen Text ausgibt. Ein solches Programm dient seit Urzeiten in Lehrbüchern einmal als Test für den Lernenden, um sich mit der Programmierumgebung vertraut zu machen und zu prüfen, ob alles funktioniert. Andererseits zeigen Sie die notwendige Grundstruktur eines Programms auf. Ein solches Programm enthält eigentlich nur die folgenden Zeilen:

Hello World als Einstieg
C++-Quelltext
System::Console::WriteLine("Hello World");
System::Console::WriteLine("Ende mit beliebiger Taste");
System::Console::ReadKey();
C#-Quelltext
System.Console.WriteLine("Hello World");
System.Console.WriteLine("Ende mit beliebiger Taste");
System.Console.ReadKey();
Delphi.Prism-Quelltext
System.Console.WriteLine('Hello World');
System.Console.WriteLine('Ende mit beliebiger Taste');
System.Console.ReadKey();
VB.NET-Quelltext
System.Console.WriteLine("Hello World")
System.Console.WriteLine("Ende mit beliebiger Taste")
System.Console.ReadKey()


"Mein neues Auto" als Einstieg[Bearbeiten]

Wir wollen ein etwas größeres Projekt vorbereiten, das später ausführlicher besprochen werden soll.

Eine Projektmappe (Englisch solution, also Problemlösung) enthält mehrere, in der Regel inhaltlich zusammengehörende Projekte. Ein Projekt (project) enthält alles, was zum Erstellen einer einzelnen Assembly (exe- oder dll-Datei) unter .NET notwendig ist.

Das folgende Programm wird auch im Kapitel "Mein neues Auto" als erstes Programm bei jeder Programmiersprache besprochen. Einzelheiten des Codes werden deshalb hier überhaupt nicht erklärt; jetzt geht es uns nur um die Möglichkeiten der IDE mit der Eingabe des Codes, dem Erstellen des Programms und der Fehlersuche.

Ein Projekt hinzufügen[Bearbeiten]

Für ein neues Projekt gibt es diese Möglichkeiten:

  • Auf der Startseite klicken Sie unter Zuletzt geöffnete Projekte auf Erstellen: Projekt....
  • Im Menü Datei wählen Sie Neues Projekt.
  • Rechtsklick auf die Projektmappe im Projektmappen-Explorer und Hinzufügen > Neues Projekt.

Es öffnet sich ein Dialog für die grundlegenden Einstellungen des neuen Projekts. Geben Sie dazu ein: den Namen des neuen Projekts, z.B. "Mein neues Auto", den allgemeinen Speicherort, z.B. "E:\Eigene Dateien\NET Projects\Wikibooks" sowie den Namen der Projektmappe, z.B. "Einstieg" (nachdem Sie Projektmappenverzeichnis erstellen aktiviert haben). Je nachdem, wie das neue Projekt gewählt wurde, ist die Projektmappe bereits fest vorgegeben oder kann ausgewählt werden.

Bestätigen Sie die Eingaben durch Klicken auf OK. Die IDE erstellt ein Gerüst mit allen Dateien, die für das neue Projekt nötig sind.

Solange es uns um einzelne Funktionalitäten der Arbeit mit .NET oder einer Programmiersprache geht, werden wir uns vorwiegend mit Konsolenanwendungen befassen. Andere Anwendungen werden in den Themen-Büchern behandelt.

Der Quelltext-Editor[Bearbeiten]

Je nach Situation wird das Hauptprogramm bereits angezeigt; oder Sie müssen es auswählen: Öffnen Sie unter Projekte, bis die Datei Program (je nachdem mit der Extension cs, vb, c o.a.) angezeigt wird. Doppelklick darauf zeigt sie an.

Damit wir die Arbeitsweise von Visual Studio demonstrieren können, ändern und ergänzen Sie den vorgegebenen Code, sodass der untenstehende Code zu sehen ist.

  • Löschen Sie zunächst die nicht vorgesehenen Zeilen am Anfang.
  • Bei Visual Basic ergänzen Sie am Anfang und Ende die Zeilen mit Namespace, bei C# ändern Sie den Text.
  • Schreiben Sie den untenstehenden Code, und zwar bis einschließlich der ersten Zeile mit WriteLine. Beenden Sie den Code mit den drei Schlusszeilen.
  • Beachten Sie, dass Einrückungen automatisch erfolgen.
  • Schreiben Sie langsam und machen Sie vor allem nach einem Punkt und einer öffnenden Klammer eine kurze Pause.
  • Schreiben Sie nach einem Punkt erst einmal nur einen Buchstaben und warten Sie wieder.

Achten Sie dabei darauf, was die IDE vorschlägt oder sozusagen vorschreibt (im Sinne von "voraus schreibt") und als Erläuterungen anzeigt. Hier bietet Visual Studio Möglichkeiten an, die Zeile logisch zu beenden. Wenn weitere Informationen angeboten werden (durch einen Text wie "2 von 19"), dann blättern Sie mit den Pfeiltasten weiter.

Es ist nicht erforderlich, dass Sie alle Informationen verstehen. Es geht jetzt nur darum, dass diese Hilfestellung angeboten wird, damit Sie bei der eigenen Programmierung darauf achten und dies nutzen.

Das Hauptprogramm
C#-Quelltext
using System;

namespace Wikibooks.CSharp.Mein_neues_Auto
{
	class Program
	{
		public static void Main(string[] args)
		{
			string input;
			if (DateTime.Now.Hour < 12) {
				Console.Write("Guten Morgen, ");
			} else if (DateTime.Now.Hour < 18) {
				Console.Write("Grüß Gott, ");
			} else 
				Console.Write("Guten Abend, ");
			Console.WriteLine(Environment.UserName);
			
			// Typ abfragen
			Console.WriteLine("Welchen Typ Auto wollen Sie sich zulegen?");
			input = Console.ReadLine();
			Car mycar = new Car(input, "998cm³ 44kW", 3);
			Console.WriteLine(mycar.ToString());
			// beschleunigen
			mycar.Accelerate(40);
			mycar.ShowValues();
			// rechts blinken
			mycar.SetRightSignal(true);
			mycar.ShowValues();
			// etwas bremsen
			mycar.Delay(20);
			mycar.ShowValues();
			// Blinker aus
			mycar.SetRightSignal(false);
			mycar.ShowValues();
			// wieder beschleunigen
			mycar.Accelerate(30);
			mycar.ShowValues();
			// Warnblinker ein
			mycar.SetBothSignals(true);
			mycar.ShowValues();
			// bremsen bis auf 0
			mycar.Delay(mycar.Speed);
			mycar.ShowValues();
			// Warnblinker aus
			mycar.SetBothSignals(false);
			mycar.ShowValues();
			                  
			Console.Write("Press any key to continue . . . ");
			Console.ReadKey(true);
		}
	}
}
VB.NET-Quelltext
Imports System

Namespace Wikibooks.VBNet.Mein_neues_Auto
	Module Program
		Sub Main(ByVal args As String())
			Dim input As String
			If DateTime.Now.Hour < 12 Then
				Console.Write("Guten Morgen, ")
			ElseIf DateTime.Now.Hour < 18 Then
				Console.Write("Grüß Gott, ")
			Else
				Console.Write("Guten Abend, ")
			End If
			Console.WriteLine(Environment.UserName)
			
			' Typ abfragen
			Console.WriteLine("Welchen Typ Auto wollen Sie sich zulegen?")
			input = Console.ReadLine()
			Dim mycar As New Car(input, "998cm³ 44kW", 3)
			Console.WriteLine(mycar.ToString())
			' beschleunigen
			mycar.Accelerate(40)
			mycar.ShowValues()
			' rechts blinken
			mycar.SetRightSignal(True)
			mycar.ShowValues()
			' etwas bremsen
			mycar.Delay(20)
			mycar.ShowValues()
			' Blinker aus
			mycar.SetRightSignal(False)
			mycar.ShowValues()
			' wieder beschleunigen
			mycar.Accelerate(30)
			mycar.ShowValues()
			' Warnblinker ein
			mycar.SetBothSignals(True)
			mycar.ShowValues()
			' bremsen bis auf 0
			mycar.Delay(mycar.Speed)
			mycar.ShowValues()
			' Warnblinker aus
			mycar.SetBothSignals(False)
			mycar.ShowValues()
			
			Console.Write("Press any key to continue . . . ")
			Console.ReadKey(True)
		End Sub
	End Module
End Namespace

Diese Art, wie Code-Teile vorgeschlagen werden, wird von Microsoft als IntelliSense bezeichnet; sie ist allgemein auch als Code-Completion (Code-Vervollständigung) bekannt.

Beachten Sie nun die folgenden Besonderheiten der Anzeige:

  • Bestimmte Abschnitte des Codes sind farbig. Diese Funktion heißt Syntaxhervorhebung. Blaue Wörter sind zum Beispiel Begriffe, die im Code eine besondere Bedeutung haben, sogenannte Schlüsselwörter (dazu später mehr).
  • Die Wörter in Anführungszeichen sind Zeichenketten, die im Programm erscheinen, wie wir gleich sehen.
  • Mit der TODO-Anweisung können Sie sich selbst darauf hinweisen, was hier noch zu erledigen ist; über die Aufgabenliste können Sie dorthin springen und so manche Programmteile auf später verschieben.

Mit diesem Code soll nun die IDE arbeiten.

Dateien speichern[Bearbeiten]

Vor dem nächsten Schritt speichert VS die betroffenen Quelldateien automatisch, sofern Sie dies als Option gewählt haben. Wenn Sie während umfangreicher Arbeiten nicht kompilieren, sondern die IDE beenden, können Sie die geänderten Dateien gezielt speichern. (Beim Schließen einer Projektmappe fragt VS auch ausdrücklich nach.) Welche Dateien seit der letzten Speicherung geändert wurden, ersehen Sie aus dem Sternchen    Program.cs *   beim Dateinamen. Sie können so speichern:

  • mit einem Klick auf das Diskettensymbol oder Strg + S die aktuelle Datei
  • mit einem Klick auf den Diskettenstapel oder Strg + Shift + S alle geöffneten Dateien.

Das Kompilieren[Bearbeiten]

Vorbereitung nur für C# und C++: Fügen Sie hinter das letzte else eine öffnende Klammer { ein.

Zunächst muss das Programm erstellt, also kompiliert werden. Das bedeutet, dass der ursprüngliche (von Ihnen geschriebene) Code in den .NET-Zwischencode übersetzt werden muss. Dies geschieht auf einem dieser Wege:

  • durch F5, wenn das Programm sofort mit Debugger gestartet werden soll
  • durch Shift + F6
  • über die Symbolleiste Erstellen mit einem Klick auf das Icon mit zwei kleinen Pfeilen
  • über das Projektmappen-Fenster durch Rechtsclick auf den Projekt-Namen "Hello World" und Erstellen

Je nach Situation ist es nützlich, die gesamte Projektmappe zu erstellen:

  • durch F6
  • über die Symbolleiste Erstellen mit einem Klick auf das Icon mit drei kleinen Pfeilen
  • über das Projektmappen-Fenster durch Rechtsclick auf die Projektmappe und Projektmappe erstellen
Kompilieren mit einem Fehler

Starten Sie also das Kompilieren. Leider enthält das Programm Fehler, die uns der Compiler mitteilt:

// bei C# und C++
Program.cs(33,2) : Fehler CS1513: } erwartet.
' bei VB
Program.vb(17,0) : Fehler BC30081: "If" muss mit einem zugehörigen "End If" abgeschlossen werden.

VB ist in diesem Fall genauer, weil die richtige Stelle angegeben wird. Das letzte Else wurde mit End abgeschlossen, es muss aber – wie die Fehlermeldung feststellt – mit End If beendet werden.

Bei den C-Varianten wird nur festgestellt, dass die Klammerpaare {...} nicht zusammenpassen: Es gibt eine öffnende Klammer ohne dazugehörige schließende Klammer. In diesem Fall ist es einfach: Zu der unter Vorbereitung eingegebenen Klammer fehlt der Partner; machen Sie dazu nach dem nächsten Write-Befehl eine neue Zeile und schreiben Sie die fehlende Klammer } hin. Sie werden sofort sehen, zu welchem Partner diese gehört. Probieren Sie das Schreiben dieser Klammern aus. In der Regel ist es am sichersten, nach einer öffnenden Klammer sofort die schließende Klammer zu schreiben und den folgenden Code dazwischenzusetzen.

Speichern Sie die geänderte Datei.

Kompilieren mit einer Warnung

Kompilieren Sie das Programm erneut. Es sollte keine Fehler mehr aufweisen, liefert aber eine Warnung:

// bei C# und C++
Die Variable input ist deklariert, wird aber nicht verwendet.
' bei VB 
Nicht verwendete lokale Variable: input.

Warnungen können theoretisch ignoriert werden; das Programm kann trotzdem ablaufen. In aller Regel ist damit aber eine Unsauberkeit im Code enthalten; deshalb sollten Sie sich immer um die Beseitigung von Warnungen kümmern. Hier wurde sie provoziert: Kopieren Sie den gesamten noch fehlenden Programmtext und speichern Sie die geänderte Datei.

Kompilieren mit weiteren Fehlern

Kompilieren Sie erneut. Nun gibt es eine Menge gleichartiger Fehlermeldungen:

Der Typ- oder Namespacename Car konnte nicht gefunden werden.
// bei C++, C#
(Fehlt eine using-Direktive oder ein Assemblyverweis?)
' bei VB
(Fehlt eine Imports-Direktive oder ein Assemblyverweis?)

Nun ja, die Definition der Klasse Car fehlt noch völlig. Also erstellen wir eine weitere Quelldatei:

  • Für C# mit Rechtsklick auf Car.cs mit der Auswahl "Ziel speichern unter" dem Namen Car.cs im Quellverzeichnis
  • Für VB mit Rechtsklick auf Car.vb mit der Auswahl "Ziel speichern unter" dem Namen Car.vb im Quellverzeichnis

Diese Quelldatei fügen wir unserem Projekt hinzu: im Projekt-Explorer nach Rechtsklick auf das Projekt über Hinzufügen > Vorhandene Datei die gerade gespeicherte Datei auswählen. Sofern diese Datei nicht sofort angezeigt wird, können Sie sie mit Doppelklick öffnen und überprüfen.

Um eine weitere Fehlermeldung zu vermeiden, die wir erst später besprechen wollen, gehen Sie im Projekt-Explorer mit Rechtsklick auf Referenzen und wählen über Hinzufügen im Bereich "GAC" die Assembly System.Drawing (Doppelklick oder "Wählen") aus und bestätigen mit OK.

Damit können wir erneut und endgültig kompilieren; es sollten keine Meldungen bleiben.

Das Ausführen[Bearbeiten]

Jetzt können wir das Programm ablaufen lassen; es gibt wieder mehrere Möglichkeiten:

  • durch F5 mit Debugger
  • über den Menü-Punkt Debuggen > Debuggen starten
  • durch Strg + F5 ohne Debugger
  • über den Menü-Punkt Debuggen > Starten ohne Debuggen
  • über den Projektmappen-Explorer durch Rechtsklick auf den Projektnamen und Debuggen > Neue Instanz starten
  • über die Symbolleiste durch Klick auf den grünen Pfeil

Der letzte Weg führt nicht immer direkt zum Ziel: Wenn die Projektmappe mehrere Projekte enthält, werden zunächst alle Projekte neu kompiliert; es wird diejenige Anwendung gestartet, die als Startprojekt festgelegt wurde.

Ein fertiges Programm kann auch "normal" gestartet werden – wie jedes installierte Programm auch:

  • in der Eingabeaufforderung direkt "Mein neues Auto" aufrufen (wegen des Leerzeichens sind die Gänsefüßchen notwendig)
  • durch Doppelklick im Inhaltsverzeichnis z.B. des Windows-Explorers oder eines Commanders

Der Programmablauf öffnet ein Konsolenfenster:

Ausgabe
'"`UNIQ--syntaxhighlight-0000000E-QINU`"'

Darin werden Ausgabezeilen angezeigt, nämlich alles, was mit Write und WriteLine angegeben wurde, und es enthält verschiedene Eingaben, nämlich einmal ReadLine und einmal ReadKey. Vor allem der letzte Befehl, der auf die Eingabe einer beliebigen Taste wartet, ist bei einer Console-Anwendung nützlich; wenn er fehlt, wird das Programm beendet, ohne dass Sie die letzte Ausgabe sehen oder gar lesen können.

Fehlersuche mit Debugger[Bearbeiten]

Dank der guten Vorarbeit (und der wenigen Arbeit, die erledigt wird) enthält unser Programm keine Fehler. Aber für den Fall der Fälle können wir es untersuchen. Sorgen Sie also dafür, dass das Programm nicht einfach durchläuft

  • Setzen Sie einen Haltepunkt (Breakpoint), indem Sie in eine bestimmte Zeile gehen, z.B. in die Zeile mit ReadLine:
    • Klicken Sie in dieser Zeile in den Fensterrahmen links von der Zeilennummer.
    • Oder klicken Sie in dieser Zeile an eine beliebige Stelle und drücken dann F9.
  • Starten Sie dann wieder Kompilieren und Ausführen (wie oben).

Das Programm wird zunächst mit der Console beginnen und dann in die IDE zurückspringen und an der betreffenden Stelle anhalten. Der Arbeitsablauf kann mit den Befehlen im Menü Debuggen bzw. mit F10 und F11 fortgesetzt werden. Gehen Sie dabei wie folgt vor:

  • Im Fenster Lokal sehen Sie, dass für input noch kein Wert vorgegeben ist.
  • Drücken Sie einmal F11. Das Programm springt in die Console, weil es dort auf eine Eingabe wartet.
  • Schreiben Sie den gewünschten Eingabetext und drücken Return.
  • Das Programm springt automatisch in die IDE zurück und steht jetzt auf der nächsten Zeile.
  • Im Fenster Lokal sehen Sie jetzt den von Ihnen eingegebenen Wert.

Mit F5 kann der Programmablauf bis zum nächsten Haltepunkt fortgesetzt werden. Bei uns kommt kein neuer Haltepunkt, aber das Programm wartet in der Console auf eine beliebige Taste; deshalb landen Sie dort und können es freigeben.

Bei späteren Programmen sollten Sie das Debuggen intensiv mit Haltepunkten, den Funktionstasten und den Variablen ausprobieren.

Versionen[Bearbeiten]

Die verschiedenen Versionen von Visual Studio arbeiten mit den .NET-Versionen so zusammen:

  • VS 2003 gehört zu .NET 1.1.
  • VS 2005 gehört zu .NET 2.0.
  • VS 2008 gehört zu .NET 3.5.
  • VS 2010 gehört zu .NET 4.0. Über Projekt > Projektoptionen kann unter    Kompilieren    auch .NET 2.0, 3.0 oder 3.5 festgelegt werden.

Zusammenfassung[Bearbeiten]

Mit Visual Studio steht eine professionelle IDE zur Verfügung:

  • Es können verschiedene Programmiersprachen verarbeitet werden.
  • Der Code-Editor berücksichtigt die Anforderungen von Programmierern.
  • Der passende .NET-Compiler und ein Debugger sind integriert.

Damit können wir umfangreiche .NET-Anwendungen erstellen.