Einführung in .NET
Was ist .NET?
.NET ist eine Plattform von Microsoft zur Entwicklung und Ausführung von Anwendungen.
Da sich am Ende des vergangenen Jahrtausends zahlreiche Plattformen mit ihren jeweiligen
Konzepten und Standards verbreitet hatten, wurde die Entwicklung von Anwendungen
für Windows zunehmend komplexer und damit anspruchsvoller.
Nur die Windows-eigene Basis namens Win32 zu kennen, war bei weitem nicht mehr ausreichend,
man musste sich zusätzlich mit COM, DCOM, Windows DNA, DirectX, ASP, ISAPI, VBA, WSH und
zahlreichen anderen Technologien beschäftigen, um zeitgemäße Anwendungen entwickeln zu
können.
Die Idee hinter .NET war, eine einheitliche und konsistent objektorientierte Plattform zu
schaffen, die alle bestehenden Konzepte vereint. Insofern beerbt .NET gewissermaßen die
genannten Plattformen, auch wenn diese - allein schon aus Gründen der Abwärtskompatibilität -
zumindest vorerst weiterhin zur Verfügung stehen werden.
Um trotz dieser Revolution einen sanften Übergang zu ermöglichen, ist es möglich, .NET wie
COM anzusprechen, und COM im Gegenzug aus .NET heraus zu nutzen. Daher kann .NET durchaus
als eine Revolution mit evolutionärem Rahmenwerk bezeichnet werden.
Plattformunabhängigkeit
Die Grundlage von .NET bildet die Common Language Infrastructure - im folgenden als CLI
abgekürzt - , eine Spezifikation, welche die plattform- und sprachunabhängige Entwicklung
und Ausführung von Anwendungen beschreibt.
Die CLI wurde im August 2000 von Microsoft, Intel und Hewlett Packard bei der ECMA zur
Standardisierung eingereicht und ein Jahr später, im Dezember 2001, unter dem Namen ECMA-335
als Standard verabschiedet. Da es sich bei der CLI um einen frei verfügbaren Standard handelt,
kann potenziell von jedem Interessierten eine eigene Implementierung entwickelt werden.
.NET ist dabei die bekannteste und am weitesten verbreitete Implementierung der CLI, wobei
es außer .NET an sich noch weitere Varianten gibt, die ebenfalls von Microsoft stammen: Das
.NET Compact Framework zur Nutzung auf mobilen Geräten, das .NET Micro Framework für
eingebettete Geräte und schließlich Rotor unter FreeBSD als Studie einer CLI-Implementierung
auf einer anderen Plattform als Windows.
Die erste Version von .NET erschien am 13. Februar 2002 in Verbindung mit der dazugehörigen
integrierten Entwicklungsumgebung - Visual Studio .NET. Bereits ein Jahr später folgten .NET
1.1 und Visual Studio .NET 2003, wobei diese Aktualisierungen neben einigen wenigen
technischen Änderungen im wesentlichen Sicherheitsaktualisierungen enthielten.
Zudem war .NET 1.1 die erste Version von .NET, die nicht nur als zusätzliche Komponente
zu Windows ausgeliefert wurde - diese Version ist standardmäßig in Windows Server 2003
enthalten.
Version 2.0 erschien weitere zweieinhalb Jahre später zusammen mit Visual Studio 2005 am 7.
November 2005. Neben zahlreichen technischen Änderungen und Verbesserungen ist bemerkenswert,
dass der Begriff .NET nicht mehr im Produktnamen von Visual Studio enthalten ist.
Am 6. November 2006 schließlich wurde .NET 3.0 veröffentlicht, das im Gegensatz zu Version
2.0 keine eigenständige Version im klassischen Sinne darstellt, sondern im Kern nach wie
vor auf .NET 2.0 basiert und dieses lediglich um vier Komponenten erweitert: Die Windows
Presentation Foundation, die Windows Communication Foundation, die Windows Workflow
Foundation und Windows Card Space.
Wie bereits .NET 1.1 wird auch .NET 3.0 nicht nur als zusätzliche Komponente zu Windows
ausgeliefert, sondern ist bereits in Windows Vista integriert.
Am 27. Februar 2008 wurde .NET 3.5 zusammen mit Visual Studio 2008 veröffentlicht. Wie
bereits .NET 3.0 setzt auch .NET 3.5 auf der Version 2.0 von .NET auf und erweitert dieses
um weitere Komponenten. Besonders hervorzuheben sind dabei die neue Version 3.0 von C# und
eine in C# enthaltene integrierte Abfragesprache namens Linq.
Neben diesen Implementierungen der CLI durch Microsoft gibt es einige weitere Implementierungen,
von denen vor allem Mono von Novell nennenswert ist. Mono war ursprünglich von Miguel de
Icaza und dessen Firma Ximian entwickelt worden, die allerdings am 4. August 2003 von Novell
übernommen wurde.
Am 30. Juni 2004 schließlich wurde Mono in Version 1.0 veröffentlicht und stellt seitdem
eine interessante Alternative zu .NET dar, da es zum einen nicht nur Windows, sondern auch
zahlreiche andere Betriebssysteme wie unter anderem Linux und Mac OS X unterstützt, und zum
anderen als Opensource verfügbar ist.
Sprachunabhängigkeit
Die CLI beschreibt jedoch nicht nur die plattform-, sondern auch die sprachunabhängige
Entwicklung und Ausführung von Anwendungen. Sprachunabhängig bedeutet dabei, dass es
keine Rolle spielt, in welcher Programmiersprache eine Anwendung geschrieben wurde.
Für die Entwicklung unter Win32 gab es essenzielle Unterschiede zwischen den verschiedenen
Programmiersprachen. Konnte beispielsweise COM aus Visual C++ uneingeschränkt genutzt
werden, war dies in Visual Basic nur eingeschränkt möglich. Außerdem unterschieden sich
die verschiedenen Sprachen in ihren jeweiligen Konventionen, so dass die erzeugten
Anwendungen auch diesbezüglich nicht immer vollständig kompatibel zueinander waren.
Zudem war es nicht möglich, in verschiedenen Sprachen geschriebene Komponenten beliebig
miteinander zu kombinieren. Das Resultat dieser Inkompatibilitäten war, dass Komponenten
häufig in mehreren programmiersprachenspezifischen Varianten zur Verfügung standen.
In .NET ist die Kombination von Komponenten und Anwendungen hingegen uneingeschränkt
möglich, was im wesentlichen der Verdienst der beiden wichtigsten Komponenten von .NET
ist: Der Common Language Runtime - im folgenden als CLR abgekürzt - und der Framework Class
Library - im folgenden als FCL abgekürzt.
Die CLR dient zur Ausführung von Anwendungen, wobei diese Anwendungen in Sprachen
entwickelt worden sein müssen, die .NET als Zielplattform adressieren. All diesen
Sprachen ist gemein, dass sie einen Unterstandard der CLI implementieren, nämlich
das Common Language Subset - im folgenden als CLS abgekürzt. Das CLS beschreibt
Eigenschaften, die zur CLR, und damit zu .NET, kompatible Sprachen aufweisen müssen.
Außerdem werden die erzeugten Anwendungen nicht - wie in klassischen Programmiersprachen -
in Maschinensprache umgewandelt, die direkt vom Prozessor ausgeführt werden kann.
Statt dessen wird eine für .NET spezifische Zwischensprache eingesetzt, die sogenannte
Microsoft Intermediate Language - im folgenden als MSIL abgekürzt.
Erst zur Ausführungszeit werden die MSIL-Anweisungen in Maschinensprache umgesetzt, die
dann auf die jeweils ausführende Hardwareplattform optimiert werden kann. Dies geschieht
durch einen Compiler, der "just in time" arbeitet, also erst auf Anforderung und nur das
jeweils Notwendige übersetzt, und daher auch als JIT-Compiler bezeichnet wird.
Da die Übersetzung während der Ausführung stattfindet, dauert der erste Aufruf einer
.NET-Anwendung naturgemäß ein wenig länger als bei Anwendungen, die in klassischen
Programmiersprachen geschrieben wurden. Die Optimierung des JIT-Compilers gleicht dies
aber aus, so dass JIT-übersetzte Anwendungen in der Regel schneller ausgeführt werden
können.
Die FCL - Framework Class Library - schließlich stellt eine Klassenbibliothek zur
Verfügung, die einige tausend Klassen für häufig auftretende Aufgaben enthält und aus
allen .NET-spezifischen Sprachen heraus genutzt werden kann. Da die FCL von der CLR
bereitgestellt wird, bleiben Anwendungen für .NET trotz einem potenziell hohen
Funktionsumfang verhältnismäßig kompakt, da diese die FCL nicht enthalten müssen.
Verwalteter Code
Außer der Anpassung an die ausführende Hardwareplattform hat die Verwendung einer
Zwischensprache noch einen weiteren Grund. Die CLR kann nämlich die auszuführenden
MSIL-Anweisungen vor der Übersetzung in Maschinensprache analysieren und potenziell
eingreifen. Da der Code zur Ausführungszeit kontrolliert wird, bezeichnet man ihn
als verwalteten Code.
Auf diese Weise kann die CLR unter anderem sicherstellen, dass Anwendungen nur auf
Speicher zugreifen, auf den sie an dieser Stelle zugreifen dürfen. Zudem kann
überprüft werden, auf welche Ressourcen eine Anwendung versucht zuzugreifen, wobei
dies bei fehlender Berechtigung verhindert werden kann.
So kann Anwendungen, die aus nicht vertrauenswürdigen Quellen wie dem Internet stammen,
zwar die prinzipielle Ausführung erlaubt, der Zugriff beispielsweise auf das Dateisystem
aber verweigert werden. Diese Einschränkung des Zugriffs auf Ressourcen zur Laufzeit
wird als Code Access Security - im folgenden als CAS abgekürzt - bezeichnet.
Schließlich führt die CLR von Zeit zu Zeit eine Speicherbereinigung durch, entfernt
Code und Daten, die nicht mehr benötigt werden, und gibt damit wieder Speicher zur
weiteren Verwendung frei. Diese Speicherbereinigung wird als Garbage Collection
bezeichnet und im folgenden als GC abgekürzt.
Zusammengefasst gilt bei .NET also, dass Sicherheit höher priorisiert wird als eine
möglichst schnelle Ausführung von Anwendungen um jeden Preis.
Erweiterungen
Zu diesem Grundgerüst von .NET, das aus der Common Language Runtime und der
Framework Class Library besteht, gibt es einige Erweiterungen, die erwähnenswert
sind. Diese gliedern sich im wesentlichen in vier Kategorien: Windowsanwendungen,
Webanwendungen, Kommunikation und Datenverwaltung.
Für Windowsanwendungen sind zunächst GDI+ und Windows Forms zu nennen. Während
GDI+ den objektorientierten und verwalteten Nachfolger der Grafikbibliothek GDI
darstellt, lassen sich mit Windows Forms grafische Oberflächen mit den gängigen
Steuerelementen erstellen.
Im Rahmen von .NET 3.0 wurde die Windows Presentation Foundation - im folgenden
als WPF abgekürzt - eingeführt, die statt eines pixelorientierten Ansatzes einen
vektororientierten Ansatz verfolgt und zudem über die auf XML basierende Sprache
XAML genutzt werden kann.
Webanwendungen und Web Services werden in .NET mit Hilfe von ASP.NET umgesetzt,
das den objektorientierten und verwalteten Nachfolger von klassischem ASP darstellt.
Mit dem in Windows Vista enthaltenen Webserver IIS 7.0 erfährt ASP.NET zudem eine
direkte Integration in den Webserver.
Zur Kommunikation mit anderen Anwendungen gibt es in .NET zahlreiche Möglichkeiten -
von Remoting über Web Services bis hin zur Microsoft Message Queue. Mit .NET 3.0
wurde als weitere Komponente die Windows Communication Foundation - im folgenden
als WCF abgekürzt - eingeführt, die alle bisherigen Konzepte kapselt und mit einer
einzigen einheitlichen Schnittstelle versieht.
Zugriff auf Datenbanken und sonstige Ressourcen geschieht in .NET mit Hilfe von
ADO.NET, das wiederum den Nachfolger von DAO und ADO darstellt. Mit der Version
3.0 der Sprache C# wurden zudem Funktionen zur Datenabfrage unter dem Namen Linq
direkt in die Programmiersprache integriert.
Schließlich gibt es noch zwei Komponenten, die sich nicht in die genannten vier
Kategorien eingliedern lassen, sondern eigenständig für sich stehen. Zum einen ist
dies die Windows Workflow Foundation - im folgenden als WF abgekürzt - , mit der
sich Workflows in .NET gestalten lassen, zum anderen Windows Card Space - im folgenden
als WCS abgekürzt - , das zur Verwaltung digitaler Identitäten dient.
Was ist C#?
C#, das als "ßiescharp [ˌsiːˈʃɑɹp]" ausgesprochen wird, ist eine Programmiersprache
für .NET, die von Microsoft in Zusammenarbeit mit dem Erfinder von Delphi, Anders
Heijlsberg, speziell für diese Plattform entwickelt wurde und daher auch als Lingua
Franca für .NET bezeichnet wird. Wie die CLI wurde auch C# von der ECMA standardisiert,
wobei die Sprache den Namen ECMA-334 trägt.
Der Name von C# lehnt sich in seiner Schreibweise an den in der Musik um einen Halbton
erhöhten Notenwert C namens Cis an, der ebenfalls als C# geschrieben wird, und bezeichnet
daher eine höhere Variante der Programmiersprache C. Außerdem kann C# so wohl als
symbolische Anspielung an die Sprache C++ wie auch als Wortspiel "see sharp" gesehen
werden.
Ein Ziel bei der Entwicklung von C# war nicht nur, eine sich perfekt in .NET einfügende
Sprache zu schaffen, sondern diese Sprache modern, durchgängig objekt- wie auch
komponentenorientiert, und vor allem verständlich zu gestalten.
Unter Win32 waren Visual C++ und Visual Basic die gängigen Sprachen zur Entwicklung von
Anwendungen für Windows, allerdings weisen beide gravierende Nachteile auf. Mit Visual C++
lassen sich zwar alle Möglichkeiten von Windows ausreizen, und es kann uneingeschränkt auf
COM zugegriffen werden, insbesondere für Anfänger ist es allerdings auf Grund einiger
ausgefallener Eigenheiten deutlich zu komplex.
Im Gegenzug dazu ermöglicht Visual Basic einen sehr einfachen Einstieg, bietet aber bei
weitem nicht die Möglichkeiten von Visual C++, ist zudem bezogen auf COM nur eine Sprache
zweiter Klasse und zeichnet sich vor allem durch die niedrige Ausführungsgeschwindigkeit
der erzeugten Anwendungen aus.
Schließich sind Visual C++ und Visual Basic auch untereinander nicht ohne weiteres kompatibel,
es gibt weder ein gemeinsames Typsystem noch ein einheitliches System zur Fehlerbehandlung, so
dass Komponenten, die in der einen Sprache entwickelt wurden, nicht notwendigerweise in der
anderen weiter genutzt werden können.
Dank dem Common Language Subset verfügen alle Sprachen unter .NET potenziell über die gleichen
Fähigkeiten, das heißt, es gibt unter .NET keine Sprachen erster und zweiter Klasse, wie dies
unter Win32 der Fall war. Die verschiedenen Sprachen für .NET unterscheiden sich daher zum einen
syntaktisch - so hat C# mit Visual Basic .NET nicht viel gemein - , zum anderen legen sie ihre
Schwerpunkte auf unterschiedliche Aspekte der Entwicklung und sprechen daher verschiedene
Zielgruppen an.
Im Vergleich zu Visual Basic .NET ist C# die abstraktere, kompaktere und mathematisch elegantere
Sprache, lässt einigen syntaktischen Zucker außen vor, und ermöglicht daher eher, sich auf die
wesentlichen Aspekte der zu entwickelnden Anwendung - die Datenstrukturen und die Algorithmen -
zu konzentrieren.