.NET 2.0
Rudolf Huttary/Arne Schäpers
.NET 2.0 Die Neuerungen
schnell + kompakt
Rudolf Huttary/Arne Schäpers .NET 2.0 – die Neuerungen schnell + kompakt Frankfurt, 2006 ISBN 3-935042-89-2
© 2006 entwickler.press, ein Imprint der Software & Support Verlag GmbH
http://www.entwickler-press.de/ http://www.software-support.biz Ihr Kontakt zum Verlag und Lektorat:
[email protected] Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar.
Korrektorat: Petra Kienle Satz: text & form GbR, Carsten Kienle Titelbild: Jutta Werz Umschlaggestaltung: Melanie Hahn Belichtung, Druck und Bindung: M.P. Media-Print Informationstechnologie GmbH, Paderborn. Alle Rechte, auch für Übersetzungen, sind vorbehalten. Reproduktion jeglicher Art (Fotokopie, Nachdruck, Mikrofilm, Erfassung auf elektronischen Datenträgern oder andere Verfahren) nur mit schriftlicher Genehmigung des Verlags. Jegliche Haftung für die Richtigkeit des gesamten Werks kann, trotz sorgfältiger Prüfung durch Autor und Verlag, nicht übernommen werden. Die im Buch genannten Produkte, Warenzeichen und Firmennamen sind in der Regel durch deren Inhaber geschützt.
Inhaltsverzeichnis Vorwort
7
Kapitel 1: Ausführungssystem 1.1 32/64-Bit-Plattformen 1.2 Sicherheitsmodell 1.3 ClickOnce-Deployment 1.4 Assemblies
9 9 11 13 14
Kapitel 2: Visual Studio 2005 2.1 Editionen 2.2 Features
17 18 19
Kapitel 3: Spracherweiterungen 3.1 Get/Set-Sichtbarkeiten 3.2 Generics 3.3 Partielle Typen 3.4 Nullbare Typen 3.5 Neu nur in C# 3.6 Neu nur in VB
23 23 24 26 27 28 30
Kapitel 4: .NET-Klassenbibliothek 2.0 4.1 Neuerungen im Überblick 4.2 Sicherheit 4.3 COM Interop 4.4 Netzwerk
33 33 35 36 37
Kapitel 5: Konsolenanwendungen 5.1 Neue Features
39 39
Kapitel 6: Windows Forms 2.0 6.1 Überblick 6.2 Erweiterungen der Toolbox
41 42 42
schnell + kompakt
5
Inhaltsverzeichnis
6.3 6.4 6.5 6.6
Designer Anwendungseinstellungen Dokumentgliederung Abwärtskompatibilität
45 48 50 51
Kapitel 7: ASP.NET 2.0 und Webseiten 7.1 Webanwendungen 7.2 Überblick 7.3 Steuerelemente 7.4 Weitere Verbesserungen 7.5 Visual Studio 2005
53 53 54 55 58 59
Kapitel 8: ADO.NET 2.0 8.1 Datenzugriff 8.2 Neuerungen
61 61 64
Kapitel 9: Web Services 2.0 9.1 Neuerungen im Überblick 9.2 Webdienstdeklaration per Schnittstelle 9.3 WSE 3.0
67 68 69 70
Kapitel 10: Compact Framework 2.0 10.1 Visual Studio 2005 10.2 Die Emulatoren … 10.3 Features des CF 2.0 10.4 SQL Server CE
71 71 71 73 74
Anhang: .NET-Grundlagen A.1 Der Ansatz A.2 Konzeption A.3 Die wichtigsten Komponenten
75 75 77 80
Stichwortverzeichnis
89
6
Vorwort Mit Einführung von .NET im Jahre 2000 leitete Microsoft ein Umschwenken auf eine neue Kerntechnologie ein, das erst in der nächsten Windows-Version – Vista – seinen vorläufigen Abschluss finden wird. Zweifellos inspiriert durch die Java-Technologie von Sun verbindet diese Technologie zwei wesentliche Eckpfeiler miteinander: 쐌 ein immanentes Sicherheitskonzept, das einen mehrschichtigen Schutz für alle beteiligten Systeme bietet 쐌 eine in sich geschlossene Welt (Sandbox-Prinzip) mit konsequenter Objektorientierung In der nun erschienenen Version 2.0 hat .NET trotz der zunächst erstaunlich langsamen Rezeption fahrplanmäßig die meisten für 1.x noch bestehenden Beschränkungen und Kinderkrankheiten überwunden. Obwohl der neue Reifegrad noch nicht ganz ausreichen dürfte, um den Bereich der Anwendungsprogrammierung bereits jetzt schon vollständig zu integrieren, sollte sich diese Frage bald nicht mehr stellen, denn die Win32-API wird den Übergang in die 64-Bit-Welt nur als Emulation zur Aufrechterhaltung der Abwärtskompatibilität (auch für bestehende .NET 1.1-Anwendungen) überleben, eine „Win64-API“ wird es nicht geben, diese Funktion fällt dann allein dem .NET Framework zu. Die Listen mit neuen Features der nun vorliegenden .NET-Version sind ausgesprochen lang. Sie zeigen nicht nur, dass die Zwei in der Versionsnummer absolut gerechtfertigt ist, sondern auch den Ernst und die Akribie, mit der man in Redmond zu Werke ging. Wer .NET 1.1 gut kennt, der mag so manche Verbesserungen als lange überfällig empfinden, bei vielen anderen überwiegt der Aha-Effekt. Wenig verwunderlich, dass sich die neue Zwei
schnell + kompakt
7
Vorwort
bei der Anzahl der Datentypen als Faktor bemerkbar macht: Mit knapp 8000 öffentlichen Datentypen, wie eine stumpfe Zählung per Reflection ergibt, hat sich das .NET Framework gut verdoppelt, ein Verhältnis, das sich überraschenderweise nicht im Installationsumfang widerspiegelt: NET 2.0 kommt wie NET 1.1 mit knapp 23 MByte aus. Veränderungen und Erweiterungen gab es in praktisch allen Bereichen des .NET-Bündels. Diese wollen wir unseren Leserinnen und Lesern mit dem vorliegenden kleinen Band zur schnellen Lektüre als Überblick in möglichst kompakter Form präsentieren. Dabei stellen wir in zehn inhaltlich abgeschlossenen Kapiteln die zentralen .NET-Technologien ultrakurz vor und gehen dann auf die wichtigsten Neuerungen ein, die .NET 2.0 für den entsprechenden Bereich der Anwendungsentwicklung jeweils mitbringt. Aufgrund der gebotenen Kürze sahen wir uns gezwungen, in den Kapiteln ein gewisses Vorverständnis der bestehenden .NET 1.x-Technologien vorauszusetzen. Leser, denen die technologischen Grundlagen von .NET noch nicht in Fleisch und Blut übergegangen sind, werden vielleicht die kleine Technologieübersicht im Anhang als wertvollsten Teil dieser Schnupperlektüre empfinden. Und wer zum Leserkreis unserer regelmäßig in der c’t erscheinenden .NET Corner gehört, sollte sich nicht wundern, wenn er unseren gewohnten Stil in dieser gut 80-seitigen SMS nicht immer wiedererkennt. Arne Schäpers, Rudolf Huttary Januar 2006
8
KAPITEL 1 Ausführungssystem 1.1
32/64-Bit-Plattformen
1.2
Sicherheitsmodell
11
9
1.3
ClickOnce-Deployment
13
1.4
Assemblies
14
Dieses Kapitel beleuchtet die Erweiterungen des .NET-Ausführungssystems in den folgenden vier Bereichen: 쐌 쐌 쐌 쐌
32/64-Bit-Plattformen Sicherheit Deployment Assembly
1.1
32/64-Bit-Plattformen
.NET wurde von Microsoft als plattformübergreifende Technologie konzipiert, die ihr Adaptionspotenzial daraus bezieht, dass Programme in zwei Stufen und zu zwei unterschiedlichen Zeitpunkten kompiliert werden. Zur Entwicklungszeit überführt der Erstellungsvorgang den Quellcode in eine plattformunabhängige zwischensprachliche Repräsentation (MSIL) und verpackt diese zur späteren Verteilung (Deploy) in das Assembly-Format. Auf dem Zielsystem übernimmt ein plattformspezifischer Justin-time-Compiler (JIT), der Bestandteil des dort vorausgesetzten .NET-Laufzeitsystems ist, die weitere Übersetzung in echte Prozessoranweisungen zur Ausführungszeit.
schnell + kompakt
9
1 – Ausführungssystem
Migration Mit dieser Zwischencode-Architektur gestaltet sich die 64-BitMigration sowohl aus der Anwender- wie auch aus der Entwicklerperspektive überraschend unkompliziert; der meiste Code sollte ohne besondere Maßnahmen oder Modifikationen auf 32und 64-Bit-Plattformen gleichermaßen laufen. Dazu gibt es das .NET Framework 2.0 in drei Varianten: 쐌 mit 32 Bit für herkömmliche x86-Prozessoren unter Windows 2k ab SP3, Windows XP ab SP2 und Windows 2003 쐌 mit 64 Bit für x64-kompatible Prozessoren unter Windows Server 2003 (Editionen: Datacenter x64, Enterprise x64, Standard x64) oder Windows XP 64-Bit 쐌 mit 64 Bit für Intel Itanium-Prozessoren (IA64) unter Windows Server 2003 (Editionen für Itanium-basierte Systeme) oder Windows XP für Itanium-basierte Systeme Auf einem 32-Bit-System erzeugt der 32-Bit-JIT-Compiler immer 32-Bit-Code, auf 64-Bit-Systemen tritt je nach Art des Codes entweder der 32- oder der 64-Bit-JIT-Compiler in Aktion. Aus Entwicklersicht wäre es natürlich schön, wenn die .NET-Programmierung in jeder Hinsicht plattformunabhängig wäre. Leider gibt es aber Situationen, die Vorannahmen über die verwendete Plattform erforderlich machen – wie die Interaktion mit COMInProc-Servern oder im nativen Code vorliegenden DLLs (P-Invoke) oder schlicht der Wunsch nach einer Nutzung der vollen Coprozessor-Fließkommagenauigkeit eines 64-Bit-Systems. Eine entsprechende Direktive lässt sich in Visual Studio 2005 auf der Seite Projekteigenschaften/Erstellen festlegen.
Was ist mit .NET 1.x-Anwendungen? Zur Ausführung bestehender .NET 1.x-Anwendungen auf 64Bit-Plattformen ist Abwärtskompatibilität seitens der Plattfor-
10
Sicherheitsmodell
men gefordert, da für diese Versionen des .NET Framework keine 64-Bit-Varianten existieren. Die 64-Bit-Editionen sowohl von Windows Server 2003 als auch von Windows XP (und deren Nachfolger) bieten daher die Möglichkeit, 32-Bit-Anwendungen über den Windows On Windows 64 x86-Emulator (WoW64) auszuführen, was dann faktisch einer Ausführung auf einem herkömmlichen 32-Bit-System gleichkommt.
1.2
Sicherheitsmodell
.NET verwendet ein neues, fein granuliertes Sicherheitsmodell, das treffend als Codesicherheit bezeichnet wird. Ähnlich wie sich ein Benutzer bei der Benutzersicherheit per Kennwort, Fingerabdruck oder Irisscan legitimiert, wenn er sich am System anmeldet, muss sich .NET-Code bei der .NET-Sicherheitsinstanz über spezifische Merkmale ausweisen. Diese ergeben sich erstens aus der Codeherkunft (Quelle, Zone), zweitens aus statischen Eigenschaften (Herstellerzertifikat, Signatur, Hashwert), die im Assembly-Manifest niedergeschrieben und unabhängig überprüfbar sind und drittens aus dem Code selbst. Anhand der Merkmale ermittelt der JIT-Compiler unter Beachtung der (dreischichtigen) Laufzeitsicherheitsrichtlinie Codegruppenzugehörigkeiten. Da für jede Codegruppe ein spezifischer Berechtigungssatz definiert ist, lässt sich aus den Zugehörigkeiten ein vollständiger Berechtigungssatz errechnen, der charakterisiert, welche Operationen für den Code erlaubt sind. Reichen seine Berechtigungen für eine bestimmte Operation nicht aus, straft ihn das System mit einer XXXPermission-Exception ab. Voraussetzung dafür, dass dem Code kein Hintertürchen offen bleibt, ist die Typsicherheit. Sie ist oberstes Gebot des Objekt- und Sicherheitsmodells von .NET. Die .NET-Spezifikation sorgt (z.B. durch Verzicht auf Zeiger und Adressoperationen im Sprachumfang) dafür, dass sich verwalteter Programmcode schlicht nicht daneben
schnell + kompakt
11
1 – Ausführungssystem
benehmen kann. Starke Typisierung und ein kohärentes, Typumwandlungen stark beschränkendes Vererbungsmodell bilden die Grundlage für die durch den Compiler durchgesetzte statische Typsicherheit, welche ihrerseits eine starke Verbesserung der Ausführungssicherheit darstellt. Programmfehler äußern sich beispielsweise als Scheitern an der Laufzeittypprüfung (dynamische Typsicherheit) bei erzwungenen Typumwandlungen oder Wertebereichsüberschreitung und werden durch den ExceptionMechanismus in reguläre Bahnen überführt. Obwohl das Sicherheitsmodell von .NET 1.x. nun nicht gerade Lücken aufweist, wurde die Entwicklung von Anwendungen mit partieller Vertrauenswürdigkeit doch durch verschiedene Faktoren behindert. Erstens erforderten bestimmte Zugriffsszenarien umfangreiche Berechtigungssätze, meist sogar FullTrust, wie beispielsweise der Datenbankzugriff über den SQL-Client. Zweitens bot die Entwicklungsumgebung keine Unterstützung bei der Ermittlung, welchen Berechtigungssatz eine Assembly tatsächlich benötigte. Drittens war keine Möglichkeit gegeben, eine Anwendung in partiell vertrauenswürdiger Umgebung halbwegs bequem zu testen bzw. zu debuggen, und viertens wurde die Analyse von Sicherheitsproblemen dadurch erschwert, dass das SecurityException-Objekt viel zu wenig Information über die Art und Umstände einer Sicherheitsverletzung bot.
Neuerungen unter .NET 2.0 .NET 2.0 trägt durch verschiedene Neuerungen nicht zuletzt den vier im vorangehenden Abschnitt aufgeführten Problemen Rechnung: 쐌 Die Klassen des .NET Framework 2.0 sind auf minimale Berechtigungsanforderungen getrimmt. Insbesondere der Zu-
12
ClickOnce-Deployment
쐌
쐌
쐌 쐌 쐌
griff auf SQL Server kann nun mit einem deutlich abgespeckten, mittleren Berechtigungssatz erfolgen. PermCalc.exe ermittelt den minimal benötigten Berechtigungssatz durch Auswertung der entsprechenden Attribute (deklarativ) sowie durch Codeanalyse (imperativ). Das Tool ist in Visual Studio 2005 auf der Seite Projekteigenschaften/Sicherheit aufrufbar. Der Debugger von Visual Studio 2005 unterstützt die Ausführung mit partiellem Vertrauen auf der Basis eines Hosting-Prozesses (nicht für C++). Die Konfiguration erfolgt auf der Seite Projekteigenschaften/Sicherheit in Visual Studio 2005. Die Klasse SecurityException erhielt einen Satz weiterer Felder, darunter Action, Method, URL und Zone, die zusätzliche Informationen über Sicherheitsverletzungen geben. Eine erteilte FullTrust-Berechtigung unterliegt keiner weiteren Prüfung durch die Sicherheitsinstanz. Sie lässt sich daher nicht mehr über Identity-Berechtigungen einschränken. GAC-Assemblies erhalten generell den Berechtigungssatz FullTrust.
1.3
ClickOnce-Deployment
Zur Weitergabe einer Windows-Anwendung gab es bisher zwei grundlegende Mechanismen: MSI- und XCopy-Deployment. Während MSI-Installationspakete eine waschechte traditionelle Windows-Installation mit allem Drum und Dran ermöglichen, beschränkt sich XCopy-Deployment auf die schlichte Kopie des Anwendungsverzeichnisses und hat damit die Voraussetzung, dass die Anwendung dort alles findet, was sie zur Ausführung braucht, ohne Eingriffe in das System als solches. Dient ein Webserver als Quelle für ein XCopy-Deployment, spricht man von No-Touch Deployment (NTD). Der Unterschied zum reinen XCopy-Deployment liegt in diesem Fall darin, dass das Frame-
schnell + kompakt
13
1 – Ausführungssystem
work die beteiligten Assemblies aus dem Netz lädt und als lokale Kopien im Assembly Download Cache (einem Unterverzeichnis des GAC) vorhält. Liegt eine neue Version für eine Assembly vor, findet eine automatische Aktualisierung statt. Obwohl dies die herstellerseitige Pflege einer Anwendung gegenüber MSI-Installationen enorm vereinfacht, hat NTD unter anderem die Nachteile, dass sich die Anwendung nur bei stehender Serververbindung ausführen lässt; eine weitergehende Installation mit Einträgen im Start-Menü und in der Software-Liste der Systemsteuerung ist nicht möglich. Das mit .NET 2.0 eingeführte Konzept des ClickOnce-Deployment soll diese Lücke schließen und die wichtigsten Aspekte aus beiden Welten zusammenführen – insbesondere die Offline-Verfügbarkeit und das einfache webbasierte Update. In der Praxis ist das Konzept so gründlich, dass es selbst Voraussetzungen zur Ausführung der Anwendung, wie etwa das Vorhandensein einer bestimmten Version des .NET Framework oder spezieller Komponenten auf dem System im Rahmen des Installations- und Aktualisierungsvorgangs einpflegt. Die Konfiguration von Click Once erfolgt auf der Seite Projekteigenschaften/Veröffentlichen in Visual Studio 2005.
1.4
Assemblies
Mit .NET 2.0 sind die Umgangsregeln für das Binden von Assemblies etwas laxer geworden. Die Formate Exe und Dll rücken mit Blick auf die Bindung näher zusammen: Verweise sind nun auch auf Exe-Assemblies möglich und diese dürfen auch in den GAC. Die Umkehrung gilt nicht: Dlls lassen sich nach wie vor nicht starten und Exe-Assemblies bestimmen weiterhin, welche .NETVersion genutzt wird.
14
Assemblies
Aliasnamen für Verweise Für .NET 1.x stellen Assemblies, die identische Namensräume bzw. Standardnamensräume (re-)definieren, eine unüberwindbare formale Hürde für die Namensauflösung bei gleich benannten Klassen dar. Um solche, durchaus realen Probleme zu umgehen, erhielten Verweise die neue Eigenschaft Alias zur Vereinbarung von Synonymen auf globaler Ebene. Vorgabewert für alle Verweise ist global. Namenskonflikte zweier Assemblies lassen sich durch Änderung dieses Werts aus der Welt schaffen. Angenommen, Sie vereinbaren den Alias MyLibrary für eine eingebundene Assembly, dann sieht die Variablenvereinbarung für eine darin definierte Klasse MyClass in C# so aus: MyLibraryAlias::MyNamespace.MyClass obj;
Eine using-Vereinbarung vereinfacht die Notation: using MyLib = MyLibraryAlias::MyNamespace; MyLib.MyClass obj = new MyLib.MyClass();
InternalsVisibleTo-Attribut Friend-Deklarationen sind potenziell unsicher und lassen sich auch von externen Modulen für einen Blick in das Innere einer Assembly missbrauchen. Das neue in AssemblyInfo.cs zu setzende InternalsVisibleTo-Attribut ermöglicht es, als internal deklarierte Typen und Elemente auch für bestimmte externe Assemblies ansprechbar zu machen: [assembly: InternalsVisibleTo("MyClient")]
Wegen einer möglichen Erschleichung von Einsichten durch schlichtes Umbenennen einer beliebigen Assembly in MyClient
schnell + kompakt
15
1 – Ausführungssystem
bietet der Name allein noch keinen richtigen Schutz. Sicher wird es erst durch einen starken Namen: [assembly:InternalsVisibleTo( "MyClient,PublicKeyToken=745901a54f88909b")]
16
KAPITEL 2 Visual Studio 2005 2.1
Editionen
18
2.2
Features
19
Das neue Visual Studio 2005 ist weit mehr als nur eine neue Entwicklungsumgebung mit hohem Komfort für die bekannten .NET-Einzelsprachen. Microsoft positioniert das Produkt als „integrierte und integrierende“ Plattform für .NET-bezogene Entwicklungsaktivitäten aller Art. Ob Office-Lösungen, Datenbanklösungen für Microsoft SQL Server 2005 oder Business Activity Monitoring-Lösungen für den auf SQL Server 2005 aufsetzenden Biztalk Server 2006, die gesamte Design-, Modellierungs- und Entwicklungsaktivität läuft ab jetzt in Visual Studio 2005 zusammen. Alles ist „pluggable“ (Projekttypen, Editoren, visuelle Designer und sonstige Werkzeuge wie beispielsweise die Web Service Enhancements) und auf der Basis weniger übersichtlicher Schnittstellen frei erweiterbar für Kommendes und Eigenes. Dieses Kapitel gibt einen allgemeinen Überblick zu den verschiedenen Ausgaben und Features von Visual Studio 2005. Die folgenden Kapitel ergänzen die Featureliste jeweils noch spezifisch mit Blick auf die jeweiligen Themenbereiche (Windows Forms, Web Forms usw.).
schnell + kompakt
17
2 – Visual Studio 2005
2.1 Editionen Mit einer geschätzten Zielgruppe von weltweit 6 Millionen professionellen und 10 Millionen Hobby- und semiprofessionellen Programmierern setzt Microsoft nun auch bei Visual Studio zunehmend auf Diversifizierung, weshalb die Produktlinie an beiden Enden wohldosierte Erweiterungen erfuhr. Während das Kernsystem, bestehend aus dem Framework (.NET Framework Redistributable 2.0) wahlweise für 32-Bit- bzw. 64Bit-Plattformen nebst dem zugehörigen SDK (.NET Framework SDK 2.0) und den J#-Erweiterungen (J#-Redistributable 2.0) kostenlos zur Verfügung gestellt und frei verteilt werden darf, geht die Preisspanne für eine passende IDE aus gleichem Hause von gratis bis hinein in den fünfstelligen Bereich. Im ersten Jahr vorerst noch kostenlos rangiert die Produktgruppe der für den Ausbildungs- und semiprofessionellen Bereich konzipierten Express-Editionen. Diese mit weniger als 40 MByte auch vom Installationsumfang her leichtgewichtigen Ausgaben von Visual Studio 2005 sind auf einzelne Sprachprodukte (VB, C#, J#, C++) bzw. auf die Webentwicklung mit ASP .NET 2.0 auf der Basis von C#, VB und J# zugeschnitten. Lizenzrechtliche Beschränkungen mit Blick auf eine kommerzielle Vermarktung eigener Entwicklungen gibt es übrigens keine. Abgerundet in Richtung Datenzugriff wird die Express-Linie durch eine kostenlose Express-Variante von SQL Server 2005 mit beachtlichen Fähigkeiten – wie Views, Trigger, Cursors und Stored Procedures. Gegen einen ernstzunehmenden kommerziellen Einsatz dieses Servers sprechen allerdings Beschränkungen wie 1 GByte RAM, 4 GByte Datenbankgröße, 1 CPU sowie ein paar fehlende Features – Benachrichtigungen, Clustering, Mirroring und Analysedienste. Die eine Nummer größere Standard Edition integriert im Wesentlichen die einzelnen Komponenten der Expresslinie zu ei-
18
Features
nem Gesamtprodukt und deckt auch die Entwicklungsfelder für Windows- und webbasierte Geschäftslösungen, Client-ServerAnwendungen sowie insbesondere den in der Expresslinie schmerzlich vermissten Mobilbereich gut ab. Die Professional Edition hingegen sollte für Einzelentwickler und auch kleine Teams keine Wünsche mehr offen lassen. Gegenüber der Standard Edition lassen sich mit ihr Remote Serverbasierte Lösungen – insbesondere auch für SQL Server 2005 mit visuellem Datenbankdesign und Berichten – bequem entwickeln und testen. Mit dem Visual Studio Team System gibt es erstmals für ein Entwicklerprodukt auch integrierte Teamlösungen, jeweils im Bundle mit einer Premium-Mitgliedschaft. Die Team-Editionen enthalten die Professional Edition plus zusätzliche Werkzeuge für Modellierung und Design, Tests, Codeanalyse, Profiling usw. Hinzu kommt das Ergänzungsprodukt Team Foundation Server, das zahlreiche weitere – nicht nur teamrelevante – Funktionen mitbringt: Quellcode-, Anforderungs-, Aufgaben-, Änderungs-, Versions- und Projektmanagement. Wem die annähernd 12 000 € schwere, allumfassende Erstjahrlizenz für die Team Suite zu teuer ist, der findet für die Hälfte des Gelds „rollenbasierte“ TeamEditionen im Angebot, deren verkleinerte Werkzeugausstattung jeweils spezifisch auf die Bedürfnisse von Architekten, Entwicklern oder Testern zugeschnitten ist.
2.2 Features Die Neuerungen in Visual Studio 2005 sind recht bunt und unterschiedlich stark auf die einzelnen Komponenten der integrierten Produkte verteilt – am meisten zu bieten haben die Sprachprodukte und ihr Umfeld. Hier ein Überblick über die wichtigsten Neuerungen:
schnell + kompakt
19
2 – Visual Studio 2005
쐌 Eine integrierte Anbindung an die einschlägigen CommunityForen im MSDN-Bereich. Auf der Basis von Microsoft Passport steht eine personalisierte Verfolgung von Anfragen und Threads mit E-Mail-Benachrichtung bei eintreffenden Antworten oder Beiträgen aus der Community zur Verfügung. 쐌 Temporäre Projekte – eine einfache IDE-Option macht das Experimentieren mit on the fly-Projekten zu einer rückstandsfreien Angelegenheit. Explizites Speichern ist natürlich möglich. 쐌 Konsequente Trennung zwischen Web- und Windows-basierter Entwicklung bereits im Datei-Menü. ASP .NET 2.0-Projekte werden über Website geöffnet und angelegt. 쐌 Automatische Sicherungskopien – die IDE legt nun von sich aus Kopien veränderter Quelltexte in einstellbaren Zeitintervallen unter dem Namen ~AutoSave. ab. 쐌 Neu gestaltetes Fenster Projekteigenschaften, das alle projektrelevanten Einstellungen auf zehn Seiten zusammenfasst. Neu sind: 쐌 Assembly-Informationen – über die Seite Anwendung aufrufbar setzt dieser Dialog die wichtigsten Assembly-Attribute, die bisher manuell in die Datei AssemblyInfo.cs eingetragen werden mussten. Zu den Vorgaben gehört auch ein automatischer GUID für eventuelles COM-Interop. 쐌 Signierung – fasst die Einstellungen für das Signieren von Assemblies und ClickOnce-Manifesten zusammen und generiert erforderlichenfalls auch Schlüsseldateien für starke Namen und Testzertifikate. 쐌 Sicherheit – fein granulierte Berechnung und Konfiguration der Codezugriffssicherheit für ClickOnce-Anwendungen. 쐌 Veröffentlichen – fasst die Einstellungen für das neue ClickOnce-Deployment zusammen. 쐌 Codeumgestaltung (Refactoring) – dazu zählen: maschinelles Extrahieren von Methoden aus Anweisungsfolgen und von Schnittstellen aus Klassenkörpern, „intelligentes“ Umbenen-
20
Features
nen unter Einbeziehung möglicher Seiteneffekte und Parametertuning in Methoden. 쐌 Codeausschnitte (Snippets) – ein enorm Tipparbeit sparendes, XML-basiertes, frei erweiterbares Repository für vordefinierte, parametrisierbare Codestrukturen und -fragmente.
Abb. 2.1: Intellisense bietet neuerdings auch Codeausschnitte zur Auswahl. Å vervollständigt erst den Listeneintrag und fügt dann den Codeausschnitt ein. Da der for-Ausschnitt parametrisiert ist, hilft der Editor beim Ausfüllen der farblich markierten Felder wiederum per Å. Dank automatischer Codeumgestaltung muss die in der Vorlage als i erscheinende Schleifenvariable nur an einer Stelle umbenannt werden.
쐌 Verschiedene neue und verbesserte Designer (àKap. 5) 쐌 Drag&Drop-Datenbindung für ADO-Szenarien (àKap. 5) 쐌 Erweiterte Farbmarkierung und Kennzeichnung von Syntax, gepaarten Klammern, Codeänderungen, parametrisierten Codeausschnitt-Feldern, im Debugger geänderten Größen usw. 쐌 Verbesserte Debugger mit erweiterter Visualisierung komplexer Variablenwerte und (über Attribute) steuerbare Objektauswertung zur Laufzeit. Das Feature „bearbeiten und fortsetzen“ ermöglicht es, im Debugger angehaltenen VB- und C#Code zu ändern und die Ausführung dann ohne Neustart fortzusetzen, was die Fehlersuche deutlich beschleunigt.
schnell + kompakt
21
2 – Visual Studio 2005
Abb. 2.2: Der Debugger erlaubt höchst ergonomisch den schnellen Einblick in hoch verschachtelte Objektstrukturen, und das allein per Mauszeiger.
Die neuen Team-Editionen … … umfassen weitere Features, die entweder als Add-ins von Visual Studio oder als Dienste des Team Foundation Server realisiert sind. Neben mittlerweile eher selbstverständlichen Funktionen wie Quellcode-, Versions- und Änderungsmanagement steht hier die Verwaltung für den kompletten ALM-Zyklus (Application Life Management) im Vordergrund. Erwähnenswert auch die in einem eigenen Menü zusammengefasste Testsuite mit umfangreichen Testmöglichkeiten im Bereich des UnitTesting (automatisierter Aufruf von Methoden mit verschiedenen Auswertungen) und Load-Testing (Verhalten des Codes bei belasteter Maschine und knappen Ressourcen).
22
KAPITEL 3 Spracherweiterungen 3.1
Get/Set-Sichtbarkeiten
23
3.2
Generics
24
3.3
Partielle Typen
26
3.4
Nullbare Typen
27
3.5
Neu nur in C#
28
3.6
Neu nur in VB
30
Aus Sicht der Einzelsprachen unterschiedlicher ausgefallen, als von manchen erwartet, gab es im sprachlichen Bereich folgende essenzielle Neuerungen: 쐌 쐌 쐌 쐌 쐌 쐌
unterschiedliche Get/Set-Sichtbarkeit (alle Sprachen) Generics (alle Sprachen, J# aber nur als Konsument) partielle Typen (C#, VB .NET) nullbare Typen (alle Sprachen) C#: anonyme Methoden, Iteratoren VB .NET: My-Funktionalität, TryCast …
3.1 Get/Set-Sichtbarkeiten Mit .NET 2.0 ist es nun in allen Sprachen erlaubt, unterschiedliche Sichtbarkeiten für Get/Set-Accessoren zu definieren. So geht’s in C#: public int Prop { get { return prop; } // public
schnell + kompakt
23
3 – Spracherweiterungen
protected set { prop = value; } }
3.2 Generics Für eine ausführungssichere Implementation abstrakter Datentypen, das sind Datentypen, die über mindestens einen, zum Erstellungszeitpunkt noch nicht festgelegten Elementdatentyp operieren, reichte die bisherige Ausdruckskraft von VB, C# und J# nicht aus. Generische Lösungen waren auf System.Object angewiesen und benötigten ebenso abenteuerliche wie zeitaufwändige Typumwandlungen, die wiederum eine potenzielle Quelle unschöner Laufzeitfehler darstellten. Nur wenn sich Verletzungen des Typsystems bereits zur Übersetzungszeit vollständig erkennen lassen, überträgt sich die Typsicherheit auf die Ausführungssicherheit. Diese Lücke schließen Generics. Vergleichbar mit Templates von C++ sind die generischen Datentypen und Methoden die mächtigste Erweiterung des Sprachumfangs, an der alle vier primären .NET-Sprachen teilhaben (J# allerdings nur als Konsument; C++ mit verwalteten Erweiterungen enthält nun beide Konzepte, da Templates und Generics im Detail unterschiedlich sind). Der darüber erzielte Gewinn an Ausdruckskraft, Sicherheit und Eleganz fand erwartungsgemäß seinen Niederschlag in der Framework Class Library (FCL), wo viele der „alten“ ebenso wie zahllose neue Datentypen nun im Gewand der Generics daherkommen – besonders prominent die Datentypen im neuen Namensraum System.Collections.Generic. Auch wenn die neue Syntax in Visual Basic – wie viele meinen: unnötigerweise – nicht gerade berauschend ausgefallen ist, so reichte wenigstens bei J# und C# die Nähe zu C++ für eine gemeinsame und auch elegante Syntax, deren prägnantes Merkmal
24
Generics
die von den C++-Templates her bekannte Notation der Typparameter in spitzen Klammern sind. In C# sieht die Definition einer generischen Klasse mit einem Typparameter so aus: public class MyStack { T[] elems; MyStack(int size){...} ... public void Push(T elem) {...} public T Pop() {...} }
Abgesehen von den spitzen Klammern wird der Typparameter T wie jeder andere Datentyp verwendet. Mehrere Typparameter landen in einer gemeinsamen Klammerung: public class Dictionary {...}
Und hier die Instanziierung einer generischen Klasse mit einparametrigem Konstruktor: MyStack<string> stack = new MyStack<string>(3);
Eine generische Methode muss selbst keiner generischen Klasse angehören, verwendet aber einen generischen Datentyp in ihrer Parameterliste: static void ExchangeTop(MyStack s, T newVal) {...}
Etwas komplizierter wird die Sache, wenn Methoden des Datentyps T ins Spiel kommen. Da der Typparameter an sich keine Aussage darüber macht, welche Operationen verfügbar sind, be-
schnell + kompakt
25
3 – Spracherweiterungen
darf es formaler Beschränkungen, die der Compiler überprüfen kann: public class EntityTable where K : IComparable where E : Entity, new() {...}
Die erste where-Klausel legt fest, dass der Datentyp K von IComparable abgeleitet sein muss, also Vergleichsoperationen bereitstellt, während die zweite gleich zweierlei fordert: E muss von der Klasse Entity abstammen und einen öffentlichen parameterlosen Konstruktor bereitstellen. In Visual Basic ersetzt das Schlüsselwort Of die spitzen Klammern: Public Class MyStack(Of elemType) Dim elems() As elemType …
Beschränkungen sehen hier so aus: Public Class EntityTable( Of K As IComparable, E As {Entity, New})
3.3 Partielle Typen Dieses Konzept ist nur in C# und VB.NET eingeführt worden. Es beinhaltet lediglich, dass sich der Quelltext einer Klasse nun auch über mehrere Dateien erstrecken darf. Dazu reicht es, den Klassenabschnitten in den Einzeldateien das Schüsselwort partial bzw. Partial voranzustellen. Partielle Typen vereinfachen die Teamarbeit und ermöglichen es IDE-Werkzeugen wie Formulardesignern, automatisch gepflegten Code in CodebehindDateien auszulagern.
26
Nullbare Typen
3.4 Nullbare Typen Die bekannten elementaren Werttypen (Ganzzahl- und Fließkommatypen, logischer Datentyp) bieten naturgemäß keine Möglichkeit zur Unterscheidung, ob eine Initialisierung erfolgt ist oder nicht. In vielen Anwendungsbereichen, beispielsweise im Umgang mit Datenbanken, wurde eine solche Möglichkeit bisher schmerzlich vermisst bzw. die Lösungsansätze trieben höchst unterschiedliche Blüten. Die nun vorhandene standardisierte Lösung hört auf den Namen „nullbare Typen“ (engl.: nullable). Ihre Implementierung steckt in der FCL-Klasse System.Nullable und verwendet Generics. C# bietet als einzige der Sprache eine sprachinterne Notation Typname + Fragezeichen an: int? ni = 10; float? nf = null; // mit null initialisiert bool? nb; // mit null initialisiert
Nullbare Typen stocken den Wertebereich des Grundtyps um einen speziellen Nullwert auf. In C# ist das null, in VB Nothing. In Visual Basic: Dim ni As System.Nullable(Of Integer) If ni.Equals(Nothing) Then …
Zusätzlich verfügen nullbare Typen über die Eigenschaften HasValue und Value sowie die (einfach überladene) Methode GetValueOrDefault(). Liefert HasValue für ein Objekt mit einem nullbaren Typ true, lässt sich sein Wert mittels Value ungestraft abfragen, andernfalls gibt es eine Exception. GetValueOrDefault() vermeidet die Exception und liefert in Abhängigkeit von HasValue entweder den Wert oder einen Defaultwert – der ist 0 oder 0.0 bzw. false in der parameterlosen Variante, bei der anderen der übergebene Defaultwert.
schnell + kompakt
27
3 – Spracherweiterungen
In J# und C++ ist der Nullwert nicht ausdrückbar, was zumindest für C++ aber kein weiteres Problem darstellt: System::Nullable ni; if (ni.HasValue) …
Dasselbe in J# ist etwas umständlicher. Selbst ein uninitialisierter Wert muss hier sinnigerweise initialisiert werden: System.Nullable test = new System.Nullable();
3.5 Neu nur in C# Anonyme Methoden Anonyme Methoden weichen den etwas schwerfälligen Formalismus auf, den die 1.x-Spezifikation von C#-Programmierern für die Verwendung von Funktionszeigern bisher auferlegt hat. Zur Verdeutlichung die Definition einer Methode DoCalc, die neben Werttypen auch einen Zeiger auf eine Funktion erwartet: delegate double Calc(double x); double doCalc(double a, Calc c) { return c(a) + 1.75D; }
In NET 1.x sieht der Aufruf von doCalc() so aus: doCalc(1.1D, new Calc(Square)); double Square(double x) { return x*x;}
28
Neu nur in C#
Ab C# 2.0 muss die einzusetzende Funktion nicht mehr als vollwertige Methode in der üblichen benannten Form definiert sein, ihr Rumpf darf auch anonym unmittelbar vor Ort erscheinen: doCalc(1.1D,delegate(double x) {return x*x;})
Darüber hinaus akzeptiert der C# 2.0-Compiler nun auch eine vereinfachte Form des ursprünglichen Aufrufs: doCalc(1.1D, Identity);
Besonders das Einbinden von Handlern wird dadurch recht elegant: Button1.Click += button1_Click;
Iteratoren Bei einem C#-Iterator handelt es sich um eine Methode mit Ergebnistyp IEnumerator – im generischen Fall: IEnumerator. Im Rahmen einer foreach-Schleife aufgerufen, besteht seine Aufgabe in der Aufzählung einer – wie auch immer zusammengestellten – Menge. Dazu liefert er mit jedem neuen Aufruf den jeweils nächsten Wert. Für die Wertrückgabe wird der return-Anweisung das eigens für Iteratoren neu eingeführte yield-Schlüsselwort vorangestellt. Es bewirkt eine Sicherung des lokalen Kontexts der Methode (Stack-Rahmen) und ermöglicht damit eine Fortsetzung der Ausführung beim nächsten Aufruf. Es gibt auch eine Notbremse: yield break unterbricht eine Aufzählung vorzeitig. Der folgende Iterator zählt die Quadratzahlen bis zur angegebenen Grenze auf:
schnell + kompakt
29
3 – Spracherweiterungen
using System.Collections; private IEnumerable Squares(int upper) { for (int i = 0; i < upper; i++) yield return i * i; }
Sein Aufruf für zehn Elemente sieht so aus: foreach (int i in Squares(10))
3.6 Neu nur in VB My-Funktionalität Die größten Umwälzungen für Visual Basic 2005 stecken in der dynamisch generierten My-Klassenbibliothek, die die Sicht einer Anwendung auf ihre Umgebung wie ehedem bei VB 6 stark vereinfacht. Obwohl ihre Funktionalität mit gewissen Einschränkungen auch anderen Sprachen wie C# offen steht, liegt die sprachliche Heimat von My klar bei VB. Die Bibliothek verkörpert in erster Linie einen intuitiv gut nachvollziehbaren Einstiegspunkt für häufig benötigte Klassen, Objekte und Funktionen, die ansonsten weit über das gesamte .NET Framework verstreut sind, und zwar zugeschnitten auf den Blickwinkel der jeweiligen Anwendung bzw. des jeweiligen Threads. Um dies zu erreichen, stellt My eine übersichtliche Menge fertiger Objekte wie Application, Computer, Forms usw. bereit, die ihrerseits wiederum über bunte Sammlungen an verständlich benannten Eigenschaften und Methoden verfügen. Beispielsweise hat Computer Eigenschaften wie Audio, Clipboard, Clock, FileSystem, Keyboard usw.
30
Neu nur in VB
Die diesen Objekten zugeordneten Informationen sammelt My auf dreierlei Arten: Erstens liefert My (nach Möglichkeit) Instanzen bestehender Datentypen bzw. Methoden oder Eigenschaften in (Um-)Benennung. My.Application.OpenForms ist synonym zu System.Windows.Forms.FormCollection. Zweitens fasst My komplexe Informationen zu einfachen Aussagen zusammen und stellt diese über eines der genannten Objekte als Methoden oder Eigenschaften bereit. Hinter einer Methode wie My.Computer.Network.IsAvailable() steckt einiges an Code, der die dem System bekannten Netzwerkschnittstellen abklappert und nach mehreren Kriterien auswertet. Drittens stellt My Objekte für Funktionalitäten bereit, die ab .NET 2.0 über Proxy-Klassen implementiert sind und deshalb nicht von der Intellisense-Funktion angezeigt werden. Betroffen davon sind beispielsweise Zugriffe auf die Zwischenablage, das Dateisystem und die Registrierung. Darüber hinaus erlaubt My einen vereinfachten Zugriff auf Formulare, per Verweis eingebundene Webservices, Ressourcen und Einstellungen des jeweiligen Projekts. Hier der Zugriff auf ein Formular: My.Forms.Form2.Show()
Da solche Größen nun direkt mit dem Klassennamen und vor allem ohne (!) vorherige Instanziierung ansprechbar sind, geht es auch einfacher: Form2.Show()
Wie bei VB6 sorgt der My-Mechanismus über entsprechenden Fabrikcode für die automatische Instanziierung von Standardobjekten.
schnell + kompakt
31
3 – Spracherweiterungen
TryCast, vorzeichenlose Datentypen, Continue, Using Schick ist auch die neue TryCast-Anweisung als gemeinsamer Ersatz für CType und DirectCast. Sie erspart die Ausnahmebehandlung, wenn eine Typumwandlung nicht klappt, und liefert stattdessen Nothing. Auch gibt es nun vorzeichenlose Datentypen: SByte, UShort, UInteger, ULong. Gleichfalls an C# orientiert: die neuen Anweisungen Continue für die Schleifensteuerung und Using-Blöcke statt Dim zur expliziten Notation des Geltungsbereichs mit beschleunigter Freigabe von Objekten mit Dispose(): Using g As Me.CreateGraphics() ... End Using ' Freigabe von g
Operatorüberladung Längst überfällig war auch die Operatorüberladung für eigene Datentypen, die sich analog zu C# auf die mathematischen, logischen, bitweisen und Typumwandlungsoperatoren beschränkt: Public Shared Operator +( c1 As Complex, c2 As Complex) As Complex
XML-Kommentare Endlich gibt es in VB auch die bei C# von Anfang an unterstützten XML-Kommentare mit Intellisense-Einbindung. Sie werden durch drei aufeinander folgende Zeilenkommentarzeichen gekennzeichnet.
32
KAPITEL 4 .NET-Klassenbibliothek 2.0 4.1
Neuerungen im Überblick
33
4.2
Sicherheit
35
4.3
COM Interop
36
4.4
Netzwerk
37
Die .NET-Klassenbibliothek, allgemein als FCL für „Framework Class Library“ bezeichnet, ist im Umfang auf nahezu das Doppelte der .NET-Version 1.1 gewachsen – auf knapp 8000 öffentliche Datentypen. Dennoch ist sie auch in der Version 2.0 weiterhin zu großen Teilen eine objektorientierte Umverpackung (neudeutsch: Wrapper) für Funktionen der Win32-API. Nach aktuellem Stand der Planungen soll sich die Gewichtung mit der .NET-Version 3.0 zum ersten Mal stark in Richtung „echter“ Komponenten verschieben; am Ende der Entwicklung wird ein Windows stehen, das auch intern komplett aus .NET-Komponenten aufgebaut ist.
4.1 Neuerungen im Überblick Die Erweiterungen der FCL in der Version 2.0 lassen sich in folgende Kategorien einteilen: 쐌 Unterstützung von 64-Bit-Plattformen. Diese Erweiterung ist, abgesehen von wenigen Fehlerkorrekturen, vollständig transparent. 쐌 Neue Steuerelemente für ASP.NET bzw. Web Forms (àKap. 7)
schnell + kompakt
33
4 – .NET-Klassenbibliothek 2.0
쐌 Neue Steuerelemente und Features für Windows Forms 2.0 (àKap. 6) 쐌 Ergänzungen für ADO.NET 2.0 (àKap. 8) 쐌 Konsole (àKap. 5) 쐌 Sicherheit (àKap. 1) 쐌 Netzwerk 쐌 Generische Klassen und Objektsammlungen (àKap. 3) 쐌 Erweiterungen von COM-Interop 쐌 ClickOnce-Installation (àKap. 1) 쐌 Hardware-Zugriffe auf niedriger Ebene (serielle Schnittstellen) Dazu kommt ein erster Versuch der Vereinfachung, der sich primär an VB-Programmierer richtet: die Klassen in Microsoft.VisualBasic.MyServices (àKap. 3). Bei Microsoft besteht man offensichtlich nicht mehr auf der Abwärtskompatibilität neuer Versionen um jeden Preis: Im MSDN sind explizit einige Dutzend Szenarien aufgelistet, in denen sich Klassen der FCL 2.0 anders verhalten als in der Vorgängerversion. In den meisten Fällen geht es dabei um schlichte Fehlerkorrekturen, einige Male aber auch um Begradigung des Designs oder Zukunftssicherheit: Der Konstruktor der Klasse System. Threading.NativeOverlapped erwartet beispielsweise nun IntPtr anstelle von Int32, damit die Sache nun auch auf 64-Bit-Systemen ohne jede Änderung funktioniert. Dass man in Redmond früher mit solchen Problemen anderes umging, zeigt die Win32-API: Sie enthält eine hohe Zahl von Funktionen, in die nachträglich irgendwelche Ausnahmebedingungen hineingestrickt wurden. Die folgenden Abschnitte konzentrieren sich auf die Teilbereiche von .NET, denen kein eigenes Kapitel gewidmet ist.
34
Sicherheit
4.2 Sicherheit An den Sicherheitskonzepten wurde an mehreren Stellen der FCL 2.0 gefeilt und verbessert, sowohl durch Erweiterung der existierenden als auch durch die Einführung neuer Klassen. Insbesondere wurden nun schmerzlich vermisste Funktionen wie beispielsweise der Zugriff auf Access Control Lists (ACL), Authentifizierungsprotokolle, Stream-Verschlüsselung und die Windows-Zertifikatsverwaltung implementiert. Weiteres zum Thema Sicherheit auch in àKap. 1.
Unterstützung für Access Control Lists (ACL) ACLs steuern die Zugriffsberechtigung für die Ressourcen eines Systems. Neue Klassen in der FCL 2.0 ermöglichen das Anlegen und Ändern von ACLs nun auch über verwalteten Code, zudem wurden die existierenden Klassen für Ein-/Ausgabe, Zugriff auf die Registrierung und Threads um Methoden erweitert, die mit ACLs arbeiten.
Authentifizierte Streams und Remoting Die neuen Klassen NegotiateStream und SslStream erlauben den abgesicherten Datenaustausch zwischen Server und Client. Die gegenseitige Authentifizierung geschieht über Negotiate bzw. Secure Sockets, Signierung und Verschlüsselung der Daten sind bei beiden Stream-Varianten möglich. Der Namensbereich System.Runtime.Remoting.Channels bietet nun auch Channel-Sicherheit für Remoting über TCP/IP.
Data Protection API (DPAPI) Diese neue API im .NET-Laufzeitsystem erlaubt das Verschlüsseln von Kennwörtern und Verbindungszeichenfolgen ohne
schnell + kompakt
35
4 – .NET-Klassenbibliothek 2.0
Rückgriff auf Win32. Unter Windows Server 2003 und Nachfolgern ist zusätzlich das Verschlüsseln von Speicherbereichen möglich.
Zertifikatsverwaltung Das Signieren von XML über X.509-Zertifikate ist mit der neuen Klasse X5092Certificate2 nun ohne Rückgriff auf die Win32-API möglich; PKCS7-Signaturen und CMS werden ebenfalls durch die FCL 2.0 direkt unterstützt.
Manifestbasierte Aktivierung Das neu eingeführte manifestbasierte Aktivierungsmodell verwendet für den Start einer Anwendung anstelle eines Verweises auf eine Assembly (plus Einsprungpunkt) ein komplettes Anwendungsmanifest, das die Anwendung selbst, ihre Abhängigkeiten, Sicherheitsanforderungen usw. beschreibt. Diese Technik stellt eine der wesentlichen Voraussetzungen für Click Once-Installationen dar. Ein Trust-Manager übernimmt hier die Prüfung durch Abgleich mit Sicherheitsrichtlinien, gegebenenfalls Rückfrage beim Benutzer und – im Erfolgsfall – das Einrichten eines Sicherheitskontexts für die Anwendungsdomäne.
4.3 COM Interop Die Interoperabilität mit COM wird durch die FCL 2.0 in mehrfacher Hinsicht verbessert: 쐌 Neue Basisklassen SafeHandle und CriticalHandle zur sicheren Arbeit mit Handles des Betriebssystems 쐌 Marshalling von Funktionszeigern auf API-Routinen und Struktur-Arrays fixer Größe
36
Netzwerk
쐌 Stark optimiertes Laufzeitverhalten bei Aufrufen zwischen Anwendungsdomänen 쐌 Im- und Export von Typbibliotheken mit neuen Schaltern für TlbImp und TlbExp ohne Umweg über die Registrierung. Dieser Punkt bezieht sich ausschließlich auf Entwicklungssysteme; er erleichtert das Übertragen von Erstellungsszenarien von System zu System.
4.4 Netzwerk Netzwerkverbindungen Hier gibt es drei Bereiche mit neuen Features: 쐌 Die neue Klasse NetworkChange meldet Änderungen der IPAdresse einer Netzwerkverbindung zurück, beispielsweise beim Wechsel zwischen Zellen eines WLAN oder beim Wiederaufbau einer Verbindung nach einer Kabelunterbrechung. 쐌 Neue Klassen in System.Net.NetworkInformation liefern Statistiken zum Datenverkehr über IP, IPv4, IPv6, TCP und UDP, der Abruf lokaler Netzwerk-Konfigurationsdaten (á la ipconfig) ist nun auch ohne Rückgriff auf die Win32-API möglich. 쐌 Die neue Klasse Ping bietet synchronen und asynchronen Zugriff auf das Ping-Protokoll zur Durchführung von Verbindungstests.
Erweiterungen in System.Net 쐌 Die neue Klasse HttpListener ermöglicht den Aufbau eines einfachen Servers für HTTP-Anforderungen unter Windows XP SP2 und Windows 2003. Gleichfalls neu in diesem Namensbereich: 쐌 Unterstützung von FTP-Client-Anforderungen in den Klassen WebRequest, WebResponse und WebClient
schnell + kompakt
37
4 – .NET-Klassenbibliothek 2.0
쐌 Zwischenspeichern von HTTP-Ressourcen und automatische Proxy-Suche 쐌 Informations- und Statistikabrufe für Netzwerke 쐌 Klassen wie System.Net.Sockets.Socket sind um Methoden zur Ablaufverfolgung und Diagnose erweitert.
Remoting 쐌 Das Remoting unterstützt in der Version 2.0 des .NET Framework IPv6-Adressen und den Austausch von generischen Typen. 쐌 In System.Runtime.Remoting.Channels.Tcp enthaltene Klassen können optional mit Authentifizierung und Verschlüsselung über SSPI arbeiten. 쐌 Für die schnelle Kommunikation zwischen Anwendungen auf einem gemeinsamen System stehen Klassen im neuen Namensbereich System.Runtime.Remoting.Channels.Ipc bereit, die ohne den Umweg über das Netzwerk arbeiten.
SMTP Neue Klassen in den Namensbereichen System.Net.Mail und System.Net.Mime erlauben das Versenden von E-Mail mit Anlagen an ein oder mehrere Empfänger; Kopien und Blindkopien (cc und bcc) werden ebenfalls unterstützt.
Generics Die FCL-seitige Unterstützung für das neue Konzept der Generics (àKap 4) steckt im neuen Namensraum System.Collections.Generic. Darüber hinaus wurden die Namensbereiche System.Type und System.Reflection.MethodInfo um Methoden zum Umgang mit Generics erweitert, beispielsweise IsGenericType() zur Identifikation generischer Typen und GetGenericArguments() für den Abruf von Typ-Parameterlisten.
38
KAPITEL 5 Konsolenanwendungen 5.1
Neue Features
39
Dem Konsolenfenster verhalf eine Handvoll kleiner, aber erlesener Features zu einem fast schon unerwarteten Revival.
5.1 Neue Features Die wichtigsten Erweiterungen der Klasse System.Console sind SetWindowsSize(), SetWindowsPosition(), Beep() und SetCursorPosition() – ihre Funktion erklärt sich bereits über den Namen. Eigenschaften wie BackgroundColor, ForegroundColor und CursorVisible bringen hingegen wieder Farbe ins Spiel und eine simple Methode wie ReadKey() zum ungepufferten Auslesen von Tastaturanschlägen ebnet den Migrationspfad für längst vergessene Konsolenspiele nach .NET.
schnell + kompakt
39
5 – Konsolenanwendungen
Abb. 5.1: Reinkarnation des Klassikers Space Invaders als Konsolenanwendung
40
KAPITEL 6 Windows Forms 2.0 6.1
Überblick
42
6.2
Erweiterungen der Toolbox
42
6.3
Designer
45
6.4
Anwendungseinstellungen
48
6.5
Dokumentgliederung
50
6.6
Abwärtskompatibilität
51
Dreh- und Angelpunkt bei der Programmierung von WindowsAnwendungen ist die Interaktion des Benutzers mit der grafischen Benutzeroberfläche, kurz die Welt der Fenster und Steuerelemente. Als einer der Eckpfeiler von .NET spezifiziert Windows Forms nicht nur die Elemente und Funktionalität dieser Welt, sondern auch ihre Design-Werkzeuge. Verglichen mit dem, was sich im Bereich Web Forms und ASP .NET beim Versionswechsel getan hat, nehmen sich die Neuerungen von Windows Forms 2.0 eher bescheiden aus. Ein Zusammenwachsen der beiden Welten wird es Microsoft zufolge erst mit der nächsten größeren .NET-Version (3.0) geben, da die Voraussetzung dafür offensichtlich ein generalüberholtes GUI ist, das auf einer XML-Basis stehen soll (genauer: XAML, einem weiterentwickelten XML, bei dem das A im Akronym für „Application“ steht). Die Initiative hört auf den Namen WPF für Windows Presentation Foundation (ehemals Avalon) und soll das bestehende Windows Forms-Modell unter Bereitstellung eines Migrationspfads ablösen.
schnell + kompakt
41
6 – Windows Forms 2.0
6.1 Überblick Die Neuerungen von Windows Forms 2.0 im Überblick: 쐌 Steuerelemente: WebBrowser, SoundPlayer, xxxStrip 쐌 Container: FlowLayoutPanel, TableLayoutPanel, SplitContainer 쐌 Komponenten: BackgroundWorker, SerialPort, ErrorProvider 쐌 Daten: DataGridView, DataConnector, Datenbindung per Drag&Drop 쐌 Designer: ToolStrip-, SmartTags-, Documentoutline, KlassenDesigner, Snaplines
6.2 Erweiterungen der Toolbox Auf der Gewinnseite bei Windows Forms 2.0 sind an vorderster Stelle eine Reihe neuer und verbesserter Steuerelemente zu nennen.
Steuerelemente Im Bereich Allgemeine Steuerelemente der Toolbox von Visual Studio 2005 gibt es nun – endlich – eine MaskedTextBox für formatgebundene Benutzereingaben und ein Webbrowser-Steuerelement zur Einbindung des Internet Explorer, der bisher nur über COMInterop mit vergleichsweise schmaler Schnittstelle verfügbar war. Im Bereich Menüs & Symbolleisten mussten die xxxBar-Steuerelemente den Platz räumen für ihre xxxStrip-Nachfolger (ToolStrip, StatusStrip, MenuStrip, ContextMenuStrip), die unter anderem mehr Typflexibilität bei der Platzierung von Elementen bieten. Als Elemente in einem MenuStrip-Menü stehen nun beispielsweise neben MenuItem standardmäßig auch ComboBox, TextBox und Separator im Angebot, während die neue Statusleiste die Ele-
42
Erweiterungen der Toolbox
menttypen StatusLabel, ProgressBar, DropDownButton und SplitButton erlaubt. Allerdings sind die xxxBar-Steuerelemente damit nicht vom Tisch. Sie lassen sich bei Bedarf (in der neuen Version 2.0) über den Kontextmenübefehl Elemente auswählen jederzeit manuell in die Toolbox aufnehmen. xxxStrip-Steuerelemente docken direkt an vorbestimmten Stellen an ein Formular an. Wenn mehr Freiheit im Layout gewünscht ist, können sie auch in ein ToolStripContainer-Panel mit umliegenden Randbereichen platziert werden.
Container Im Bereich Containers stechen zwei neue Layout-Steuerelemente FlowLayoutPanel und TableLayoutPanel ins Auge. Sie dynamisieren das Steuerelementlayout zur Laufzeit mit Blick auf die jeweiligen Formularabmessungen, indem sie über die standardmäßigen Andock- und Verankerungsmöglichkeiten hinausgehend horizontalen und vertikalen Umbruch sowie verschiedene Rasteranordnungen ermöglichen. Neu ist auch, dass fast alle Steuerelemente nun über eine AutoSize-Eigenschaft verfügen, die eine automatische Größenanpassung an den Inhalt ermöglicht. An die Stelle des eher unhandlichen Split-Steuerelements ist nun der SplitContainer getreten, ein in zwei Bereiche aufgeteiltes Panel mit wahlweise vertikalem oder horizontalem Verschiebeelement.
Komponenten Bei den Komponenten gibt es eher mäßigen Zuwachs: Von vielen heiß erwartet, ist nun endlich eine SerialPort-Komponente verfügbar, die erfreulicherweise ihren Weg auch in das .NET Compact Framework 2.0 gefunden hat. Weniger spektakulär nimmt sich die BackgroundWorker-Komponente aus. Ihr Mehrwert gegen-
schnell + kompakt
43
6 – Windows Forms 2.0
über der Methode QueueUserWorkItem() liegt im synchronisierten Rückruf für Fortschrittsmeldungen. Zwar nicht als Komponente vorliegend, dennoch erwähnenswert, sind die neuen Klassen SoundPlayer und SystemSounds zur Ausgabe von Audio-Dateien im Wav-Format bzw. Systemsounds.
Daten Zweifellos das größte Kaliber ist das DataGridView-Steuerelement. Als Nachfolger von DataGrid und dessen zahlreichen COM-Varianten übernimmt es in Windows Forms 2.0 die zentrale Rolle bei der tabellenorientierten Datenpräsentation. Nutzt man als Ansatz für eine Datenzugriffslösung den überaus eleganten neuen Mechanismus der Drag & Drop-Datenbindung von Visual Studio 2005, findet der Programmierer nach dem Drop einer Datenquelle auf das Formular ein vollständig eingerichtetes und streng typisiertes ADO .NET 2.0-Szenario für den sofortigen Datenzugriff vor. Es besteht, wie Abbildung 6.1 zeigt, aus einem gebundenen DataGridView-Steuerelement, den drei typisierten Elementen TableAdapter, DataSet und BindingSource sowie einem dem Bedienkomfort dienenden BindingNavigatorElement, ein spezialisiertes ToolStrip-Steuerelement. Die in .NET 2.0 neu eingeführte BindingSource-Komponente bildet in diesem Fall eine weitere Schicht zwischen dem Dataset und dem DataGridView-Steuerelement, die die Flexibilität beim visuellen Anwendungsdesign erhöht. Zur Auswahl der Datenquelle lässt sich über den Menübefehl Daten / Neue Datenquelle hinzufügen der Datenquellen-Konfigurationsassistent starten. Er liefert im Fenster Datenquellen einen DataSet-Knoten mit den als Ausgangspunkt der Operation verwendbaren Tabellen, Relationen und so weiter.
44
Designer
Abb. 6.1: Die Drag&Drop-Datenbindung liefert per Mausklick ein vollständiges ADO .NET 2.0-Szenario mit DataGridView-Steuerelement
6.3 Designer Im Falle von C# und VB. NET, wo das Konzept der partiellen Klassen zur Verfügung steht, lagert der Formulardesigner von Windows Forms 2.0 seinen automatisch generierten Code in eine Codebehind-Datei namens Assembly.designer.cs aus. Die neuen visuellen Funktionen des Formulardesigners zielen im Wesentlichen auf ein schnelleres und präziseres Layout sowie eine vereinfachte Initialisierung. Wer auf seinem Entwicklungssystem die Darstellung Windows XP-Stil für Fenster und Schaltflächen aktiviert hat, bekommt diese nun auch durchgängig angezeigt. Die von Vielen erwartete in-situ-Beschriftung von Steuerelementen des Typs TextBox, Label, Button, ListBox usw.
schnell + kompakt
45
6 – Windows Forms 2.0
fehlt hingegen. Dieses Feature hat aus welchen Gründen auch immer die Alpha-Phase von .NET 2.0 nicht überlebt.
Der Strip-Designer … … stellt eine Verallgemeinerung des bisherigen Menüdesigners für xxxStrip-Steuerelemente dar. Er ermöglicht ihre interaktive Bestückung mit den jeweils zulässigen Elementtypen. Die Möglichkeit der Beschriftung ist weiterhin nur bei MenuStrip gegeben.
Abb. 6.2: Die drei xxxStrip-Designer
Smarttags Das dem Formulardesigner zugrunde liegende Objektmodell macht es möglich, Aktionen für Komponenten zu definieren, die ihr Verhaltensrepertoire zur Entwurfszeit festlegen. Bisher waren diese Aktionen allein über das Kontextmenü (und die Mausaktionen) zugänglich. Mit Smarttags gibt es nun eine etwas „intelligentere“ Alternative, die neben Befehlsschaltflächen auch Eingabeelemente und Beschriftungen vorsieht und an einen eigenen Minidesigner gebunden ist. Per Klick auf das kleine
46
Designer
Dreieckssymbol an der oberen rechten Ecke des Steuerelements aktiviert, ermöglichen Smarttags die zeitsparende Vorortinitialisierung bestimmter ausgewählter Eigenschaften oder wenigstens den direkten Aufruf wichtiger Eigenschaftsdialoge für die Initialisierung wichtiger untergeordneter Elemente. Nicht alle Steuerelemente bieten Smarttags; fraglich bleibt aber, warum Microsoft die Funktionalität der in-situ-Beschriftung für Labelund Button-Steuerelemente nicht wenigstens per Smarttags gelöst hat.
Abb. 6.3: Smarttags bieten beschleunigten Zugriff auf wichtige Entwurfszeitaktionen und Eigenschaften
SnapLine Die größte Zeitersparnis beim Formulardesign bringt jedoch die neue erfreulich intelligente SnapLine-Funktionalität bei der Dimensionierung und Positionierung von Steuerelementen, die selbst vor individuellen Gruppierungen nicht zurückschreckt. Die Kombination aus magnetischen Rasterpunkten, intelligent berechneten Hilfspunkten und der Anzeige von farblich unter-
schnell + kompakt
47
6 – Windows Forms 2.0
schiedenen Linien zu möglichen Ausrichtungspunkten verbessert die Ergonomie in schier ungeahntem Maße. Angezeigt werden nicht nur Ausrichtungslinien in horizontaler und vertikaler Richtung zu den Umrisspunkten der umliegenden Steuerelemente, Minimalabstände und Randabstände, sondern auch Ausrichtungslinien zu inneren Ausrichtungspunkten, die sich beim Steuerelementdesign frei definieren lassen. Es sieht aus, als hätte man an alles gedacht – selbst eine Ausrichtung per Tastatur ist möglich: Ÿ+Richtungstaste springt von Ausrichtungspunkt zu Ausrichtungspunkt.
Abb. 6.4: Der Formulardesigner erleichtert die Ausrichtung, Positionierung und Dimensionierung von Steuerelementen durch magnetische Positionen, Hilfslinien zu Ausrichtungspunkten und die Anzeige von Abständen.
6.4 Anwendungseinstellungen Elegant ist auch der neue Mechanismus zum Speichern der Anwendungseinstellungen. In Visual Basic 2005 über My.Settings, in C# 2005 über Anwendung.Properties.Settings nicht minder direkt ansprechbar, ermöglicht er die separate Verwaltung von Einstellungen wahlweise auf Anwendungs- oder Benutzerebene. Speicherort der Einstellungen ist eine auch nach der Übersetzung jederzeit noch editierbare XML-Datei mit dem Namen der ausführbaren Datei und dem Suffix „.config“ im Anwendungsverzeichnis. Visual Studio 2005 bietet auf der Seite Projekteigenschaften/Einstellungen des völlig neu konzipierten Dialogs einen
48
Anwendungseinstellungen
eigenen Editor, mit dem sich Einstellungen bequem generieren und bearbeiten lassen. Einmal generierte Einstellungen können dann zur Laufzeit über das globale Settings.Default-Objekt der Anwendung abgefragt, aber auch mit veränderten Werten wieder abgespeichert werden.
Abb. 6.5: Binden der Formulareigenschaft ClientSize an eine zuvor (in Projekteigenschaften/Einstellungen) generierte Anwendungseigenschaft gleichen Typs und Namens
Sozusagen als Schmankerl ermöglicht Windows Forms 2.0 eine bilaterale Bindung von Formulareigenschaften an solche Einstellungen, mit dem Effekt, dass diese beim Programmstart automatisch wirksam werden – und die mit dem Formulardesigner eingestellten Initialisierungswerte überschreiben. Den Code für die Settings-Klasse (zu finden in Settings.Designer.cs) ebenso wie den zusätzlichen Initialisierungscode generiert der Designer. Einzig die Bindung der Anwendungseinstellung an die jeweilige Eigenschaft muss über den Dialog Anwendungseinstellungen (aufzurufen über den PropertyBinding-Eintrag im Eigenschaften-Fenster des Formulars) angegeben werden. Abbildung 6.5 zeigt dies für unser folgendes kleines C#-Beispiel.
schnell + kompakt
49
6 – Windows Forms 2.0
Um die in der Config-Datei gespeicherten Werte gebundener Anwendungseinstellungen zur Laufzeit wiederherzustellen, ist ein Reload()-Aufruf des Settings.Default-Objekts erforderlich: Settings.Default.Reload(); ClientSize = (Size) Settings.Default["FormSize"];
Auf Benutzerebene geltende Einstellungen lassen sich zur Laufzeit analog nach folgendem Muster dauerhaft speichern: Settings.Default["FormSize"] = ClientSize; Settings.Default.Save();
6.5 Dokumentgliederung Ergänzend zur Designerfunktionalität bietet Visual Studio 2005 mit dem Fenster Dokumentgliederung eine weitere Ansicht, die es erleichtert, die hierarchische Organisation (Verschachtelung) der Steuerelemente auf einem Formular per Drag&Drop nachzubearbeiten und ihre Benennung (mit Auswirkung auf den betroffenen Quellcode) zu vereinheitlichen.
Abb. 6.6: Das Fenster Dokumentgliederung
50
Abwärtskompatibilität
6.6 Abwärtskompatibilität Erwartungsgemäß lässt sich .NET 1.x-Sourcecode ohne Schwierigkeiten auch unter .NET 2.0 kompilieren. Für die vollständige Migration von .NET 1.x-Projekten nach .NET 2.0 ruft Visual Studio einen Konvertierungsassistenten auf den Plan, der die notwendigen Anpassungen vornimmt. Obwohl die Kompatibilität von Microsoft als hochgradig eingestuft wird (vgl. auch àKap. 4.1), entpuppt sich in der Praxis so manche unter .NET 1.x problemlos laufende Windows-Anwendung unter .NET 2.0 als Codebrecher aufgrund von InvalidOperationException-Ausnahmen. Ursache ist in den meisten Fällen schlampige Thread-Programmierung, bei der Hintergrund-Threads unsynchronisiert auf Steuerelemente zugreifen, die bekanntlich grundsätzlich im Vordergrund-Thread bzw. UI-Thread ausgeführt werden. Da .NET 1.x diese Praxis trotz anders lautender Empfehlung in der Dokumentation bisher nicht geahndet (ja sogar noch eine implizite Synchronisation betrieben) hat, fällt das Problem erst bei der Migration auf, denn .NET 2.0 ist in der Standardeinstellung weniger tolerant. Der folgende Code läuft unter .NET 1.1, löst aber unter .NET 2.0 besagte Ausnahme aus: using System.Threading; ... void but_Click(object sender, EventArgs e) { ThreadPool.QueueUserWorkItem(dowork); } void dowork(object o) { button1.Text = "Crashtest"; }
schnell + kompakt
51
6 – Windows Forms 2.0
In weiser Voraussicht, dass sich hier Schwierigkeiten auftun werden, hat Microsoft dem Control-Objekt eine zusätzliche Eigenschaft namens CheckForIllegalCrossThreadCalls spendiert. Setzt man diese Eigenschaft bei einem Formularobjekt auf false, ergibt sich wieder das gewohnte Verhalten. Der Königsweg unter .NET ist allerdings die Synchronisation per Invoke() oder BeginInvoke(): void dowork(object o) { if(InvokeRequired) Invoke(new myCall(DoIt)); else DoIt(); } delegate void myCall(); void DoIt() { button1.Text = "Crashtest"; }
52
KAPITEL 7 ASP.NET 2.0 und Webseiten 7.1
Webanwendungen
53
7.2
Überblick
54
7.3
Steuerelemente
55
7.4
Weitere Verbesserungen
58
7.5
Visual Studio 2005
59
7.1
Webanwendungen
ASP.NET wird von Microsoft als vereinheitlichtes Entwicklungsmodell für die serverseitige Programmierung von EnterpriseWebanwendungen bezeichnet. Der Name stammt von den Active Server Pages aus COM, aber schon vom Ansatz her geht ASP.NET aufgrund seiner Objektorientierung und des an die Windows-Programmierung angelehnten Ereignismodells weit über ASP, PHP oder JSP hinaus. Stark vereinfacht besteht eine ASP.NET-Anwendung aus einer Webseite, die wie das Formular einer Windows-Anwendung Steuerelemente (Web Controls) mit zugeordneten Datenquellen und Ereignis-Handlern enthält. Im Unterschied zur WindowsAnwendung wird die hinter den Steuerelementen steckende Programmlogik jedoch nicht auf der Client-Maschine, sondern auf dem Webserver ausgeführt (Attribut runat="server"), der insbesondere auch die Verarbeitung der meisten Ereignisse übernimmt (Stichwort: Postback). Im klassischen ASP generiert serverseitiger Programmcode auf der Basis von Vorlagen mit Platzhalterelementen HTML-Seiten,
schnell + kompakt
53
7 – ASP.NET 2.0 und Webseiten
die an den Client ausgeliefert werden. Bei ASP.NET steuert der serverseitige Code in HTML-Seiten eingebettete Web Controls, die ihrerseits HTML generieren – und das auch noch browserspezifisch („adaptives Rendering“). Dementsprechend hoch fällt die Einsparung an Entwicklungsarbeit und Code aus: Microsoft sprach bei der Einführung von ASP.NET von 40 bis 70%, bei der Version 2.0 ist dank vieler neuer Web Controls von weiteren 70% die Rede.
7.2
Überblick
ASP.NET und Webseiten sind der Teilbereich von .NET, der für die Version 2.0 am stärksten überarbeitet wurde. Die neuen Features lassen sich in drei Kategorien einteilen: 쐌 Steuerelemente: Die FCL 2.0 bietet neue Steuerelemente zur Darstellung und Bearbeitung von Daten, für das Login und dazugehörige Standardaufgaben wie Kennwortzusendung, Bausteine (Web Parts) für eigene Portale (Layout und Verhaltenslogik nachträglich definierbar) sowie Erweiterungen und Verbesserungen bereits bekannter Elemente (selbst das nun eigentlich überholte DataGrid wurde renoviert). 쐌 Seiten-Framework: Die Unterstützung für den Entwurf von Webseiten wurde massiv ausgebaut. In der Version 2.0 bietet ASP.NET nun Seitenvorlagen, die als Themes und Skins bezeichneten Designvorlagen und -vorgaben für Seitengruppen, eine einfache Lokalisierung (d.h. anderssprachige Ressourcen) und diverse neue Optionen für die komplette oder teilweise Kompilierung. 쐌 Dienste und APIs: Bei der Benutzer- und Rollenverwaltung sowie der Sicherheit hat sich einiges getan. Einige wichtige Stichpunkte: Verwaltung von Profilen, neue Konfiguration, cookielose Sessions, Site Maps, Health Monitoring, SQL
54
Steuerelemente
Caching und schließlich Anwendungseinstellungen (beliebige Name-Wert-Paare, nicht nur für Webportale mit Webparts). Die folgenden Abschnitte beleuchten diese Erweiterungen im funktionalen Zusammenhang, können aufgrund der überwältigenden Zahl der Änderungen aber kaum ins Detail gehen. Ein Überblick über die von Visual Studio 2005 zur Verfügung gestellten Entwicklungswerkzeuge schließt das Kapitel ab.
7.3
Steuerelemente
Die allgemeinen Verbesserungen umfassen hier das adaptive Rendering (Steuerelemente in ASP.NET 2.0 erzeugen browserspezifische Tags XHTML-konform in HTML 1.1) und die Lokalisierung, die sich über XML-Ressourcen für Steuerelementinhalte (spezifisch: Beschriftungen) automatisieren lässt. Erweiterungen gab es grob in drei Bereichen: Standardfunktionen, Datenanzeige und Ersatz für HTML-Steuerelemente.
Standardfunktionen: Login und Kennwort ASP.NET 2.0 bietet zahlreiche neue Steuerelemente für häufig anfallende Standardaufgaben. Die wohl auffälligste Verbesserung dürfte das LoginView-Steuerelement darstellen. Unmittelbar nach Platzierung in ein Webseiten-Design umfasst es nicht mehr als ein Rechteck mit Überschrift. Was in ihm steckt, zeigt sich erst im Zusammenspiel mit einer geeignet ausgestalteten Layoutvorgabe. In-situ-Beschriftung ist bei Webform-Steuerelementen übrigens größtenteils möglich.
schnell + kompakt
55
7 – ASP.NET 2.0 und Webseiten
Abb. 7.1: Ausgestaltetes LoginView-Steuerelement. Seine Elemente sollten selbsterklärend sein, die kleinen Dreiecke zeigen an, dass das Steuerelement Smarttags (àKap. 6) anbietet.
Webparts Dieser neue Begriff steht für einen integrierten Satz von Steuerelementen, die im Zusammenspiel eine weitgehend abstrahierte Gestaltung von Webseiten mit reichhaltigen strukturellen und funktionellen Möglichkeiten gestatten. Der Clou dabei ist, dass sich der Benutzer das Layout seiner Benutzeroberfläche durch Auswahl von spezifischen Inhalten, Layouts und funktionellen Elementen (Webpart-Steuerelementen) und auch deren spezifisches Verhalten per Browser selbst konfigurieren kann. Webpart-Steuerelemente sind in den meisten Fällen datengebunden. Eine typische Personalisierung besteht beispielsweise darin, dass sich der Benutzer aussucht, in welchen Spalten welche Inhalte in welcher Reihenfolge dargestellt werden – beispielsweise für eine Liste mit favorisierten Links. Dabei sind die „personalisierbaren“ Eigenschaften an die Identität des Benutzers gebunden, das heißt über die Benutzeridentität abrufbar und werden sitzungsübergreifend gespeichert.
56
Steuerelemente
Das Webparts-Modell verwendet folgende Struktur: Jede Webparts-Webseite muss ein WebPartManager-Steuerelement als übergeordnete Instanz für die anfallenden Verwaltungsaufgaben enthalten. Weiterhin ein oder mehrere allgemeine WebPartZoneElemente die als Container für untergeordnete spezifische XxxZone-Elemente (EditorZone, CatalogZone …) fungieren, welche ihrerseits als Container für dazu passende XxxParts-Elemente (EditorParts, CatalogParts …) auftreten. Dabei verwalten Catalog-Elemente Listen mit auswählbaren Webpart-Elementen und Editor-Elemente deren Personalisierung.
Datenanzeige Neu bei ASP.NET 2.0 ist nicht nur das Datenbindungsmodell – hier erweitern Datenquellensteuerelemente das gewohnte Zugriffsszenario –, sondern auch die meisten Elemente zum Darstellen und Bearbeiten von Daten. GridView ist ein universeller und in fast jede Richtung ausgebauter Ersatz für das bekannte DataGrid; hinzu kommen die neuen Steuerelemente DetailsView, FormView und TreeView (für Sitemaps).
Abb. 7.2: Darstellung der Tabelle Shippers aus der Northwind-Beispieldatenbank in einer GridView-Komponente in Minimalversion. Für diesen Screenshot wurde keine einzige Zeile Code geschrieben.
schnell + kompakt
57
7 – ASP.NET 2.0 und Webseiten
Steuerelemente als HTML-Ersatz Typische Vertreter dieser Gruppe sind die neuen Klassen FileUpload, ImageMap und HiddenField. Sie bieten optisch kaum etwas Neues, fügen sich aber nahtlos in das Ereignismodell von Web Forms ein.
Abb. 7.3: Unspektakulär, aber praktisch: die FileUpload-Komponente
7.4
Weitere Verbesserungen
Dieser Abschnitt führt weitere Verbesserungen und Erweiterungen von ASP.NET 2.0 stichpunktartig auf. 쐌 Gestaltung: Masterseiten und Themenseiten für einheitliche Designvorgaben 쐌 Profileigenschaften: Zuordnung von Werten zu einem Benutzer (angefangen von seiner Adresse bis hin zu seinen Interessen, beispielsweise den bei seinem letzten Besuch angesehenen Produkten) 쐌 Authentifizierung ohne Cookies: dynamisch generierte URLs mit einem Token anstelle von per Cookie lokal (und verschlüsselt) abgelegten Benutzernamen bzw. SessionIDs 쐌 Validierungen: lassen sich nun auch gruppieren (anstatt sämtliche Prüfungen bei jedem Postback eines Werts auf einmal auszuführen) Im Bereich der Entwicklung hat sich ebenfalls einiges getan: 쐌 Codebehind-Modell: Mit partiellen Klassen ist die weitgehende Trennung zwischen HTML und Programm möglich. Neu dabei sind das CodeFile-Attribut in der Page-Direktive und die Deklaration der Codebehind-Klasse als partielle Klasse. Auch brauchen Server-Steuerelemente nun nicht mehr explizit in
58
Visual Studio 2005
der Codebehind-Klasse deklariert zu werden, das passiert implizit. 쐌 Kompilierung: ASP.NET 2.0-Anwendungen lassen sich zum Schutz geistigen Eigentums inklusive des gesamten HTMLCodes nun auch kompilieren und in binärer Form als DLLs verteilen. Die zur Wahrung der Kompatibilität nach wie vor mitgelieferten asmx-Dateien sind dann nur leere Dummys. 쐌 Erweitertes Caching: Caching ist nun über einen Disk Output Cache beständig (persistent) möglich, sogar für Seiten, bei denen in jeder Auslieferung einzelne Teile ersetzt werden müssen (Stichwort: Post Cache Substitution). 쐌 Administration: verbesserte Tools, deklaratives URL-Remapping per web.config, Entwicklung nicht auf wwwroot-Ordner beschränkt.
7.5
Visual Studio 2005
Neben einem erweiterten Visual Web Developer (siehe weiter unten) hat VS 2005 für die Entwicklung mit Web Forms die folgenden Neuerungen zu bieten: 쐌 Speicherort nicht mehr auf einen Unterordner von wwwroot beschränkt, sondern frei wählbar – sogar auf einem FTP-Server 쐌 Ein Webserver mit FrontPage Extensions bzw. ein installierter IIS wird nun nicht mehr vorausgesetzt, denn VS 2005 hat einen integrierten ASP.NET-Entwicklungsserver. Dieser basiert auf dem bekannten Cassini-Server und arbeitet ausschließlich lokal (über einen automatisch konfigurierten Port). 쐌 Optionales Arbeiten mit dem Einzeldateimodell (im Gegensatz zum Codebehind-Modell). 쐌 Projektdateien sind für Webprojekte überflüssig geworden, die Verwaltungsdaten werden vollständig in den einzelnen Webforms vorgehalten bzw. landen in der Datei web.config.
schnell + kompakt
59
7 – ASP.NET 2.0 und Webseiten
Visual Web Developer Visual Studio 2005 integriert ab der Standard Edition den Visual Web Developer, den Microsoft auch als separates Produkt anbietet (in der Express-Variante komplett kostenfrei). Die wesentlichen Features dieses Programms sind: 쐌 쐌 쐌 쐌
Grafische IDE für WebForms und HTML-Dateien XML-Editor für web.config Ressource-Editor für .resx-Dateien Debugger für Webanwendungen
Die Verbesserungen der neuen Version umfassen: 쐌 Eigener HTML-Code lässt sich vor unbeabsichtigter Umformatierung bei Veränderungen des Designs schützen, die Formatierung der einzelnen Tags in der Quelltext-Ansicht lässt sich individuell festlegen. 쐌 Smarttags im Designer mit der Anzeige möglicher Aktionen 쐌 Drag&Drop-Datenbindung im Designer 쐌 Vollständige Darstellung selbst definierter Steuerelemente im Designer, die Vorversion beschränkte sich hier auf graue Rechtecke. 쐌 Code-Editor mit Unterstützung für Codebehind-Dateien 쐌 Unterstützung durch Intellisense auch in der .aspx-Seite (für Direktiven und Tags) 쐌 Clientseitige Ereignis-Handler sind möglich 쐌 Folding Editor wie bei C#-Code für HTML-Tags 쐌 Integrierte Prüfungen auf HMTL-Konformität, der verwendeten Pfade und der Konformität mit internationalen Standards für Behinderte
60
KAPITEL 8 ADO.NET 2.0 8.1
Datenzugriff
61
8.2
Neuerungen
64
8.1 Datenzugriff ADO.NET versteht sich als zentrale Datenbankschnittstelle von .NET. Der Name wurde von den ActiveX Data Objects aus COM übernommen, deren Funktionalität sich hier nur noch als Untermenge wiederfindet: ADO.NET hebt mit den Managed Data Providers als Ersatz für die OLE DB Provider die ursprüngliche Trennung zwischen ADO und OLE DB zugunsten einer einheitlichen Schnittstelle für alle Datenbanksprachen auf. Das ADO-Schema für den Datenzugriff unterscheidet zwischen Datenquelle, Datenadapter, Datenprovider und Datenabnehmer und gibt drei bzw. vier Pfade für die Abwicklung vor: 쐌 DataReader: für den schnellen rein sequenziellen Lesezugriff. Objekte dieser Klasse sind providerspezifisch. 쐌 DataSet: für den providerunabhängigen Zugriff. DataSets selbst sind generisch gegenüber der Anwendung, benötigen ihrerseits für die Kommunikation mit der Datenquelle aber einen –providerspezifischen – DataAdapter. 쐌 Command: Objekte für – providerspezifische – Änderungsoperationen über Datenbanken (Insert, Update und Delete)
schnell + kompakt
61
8 – ADO.NET 2.0
쐌 Datenquellensteuerelemente: als optionale Schicht zwischen der Anwendung und den drei vorgenannten Wegen. Sie machen nicht zuletzt in Web Forms die Anbindung von Steuerelementen an Datenquellen einfacher. DataReader DataReader-Objekte lassen sich am besten als serverseitige Cur-
sors für den reinen Vorwärts-Lesebetrieb charakterisieren. Über SqlCommand-Objekte für konkrete Verbindungen erstellt, sind sie providerspezifisch (SqlDataReader, OleDbDataReader, …): SqlConnection sc = new SqlConnection(ConStr); SqlCommand cmd = new SqlCommand(SQLStr, sc); SqlDataReader reader = cmd.ExecuteReader();
Datenbankzugriffe auf der Basis von DataReader sind erheblich schlanker und auch schneller als Datasets, da sie schlicht Ergebnisse von SELECT-Befehlen zeilenweise liefern. DataSet Ein ADO-Dataset fungiert als formaler Behälter für eine beliebige Zusammenstellung von Tabellen (DataTable) und Relationen zwischen diesen Tabellen. Ob diese Daten über SQL-Abfragen zustande kamen, von einer Anwendung generiert wurden oder einen Teilbereich eines Excel-Rechenblatts wiedergeben, macht für den Abnehmer keinen Unterschied. Charakteristisch für diese Art von Datenzugriff ist die Verbindungslosigkeit: Datasets sind eigenständige, speicherbasierte Kopien (also Schnappschüsse) von individuell zusammengestellten Datenbankinhalten, die optional ein späteres Zurückschreiben aller oder nur der geänderten Inhalte auf die ursprünglichen Datenquellen erlauben.
62
Datenzugriff
Datasets sind providerunabhängig und wickeln ihre Zugriffe auf Datenquellen über DataAdapter-Objekte ab: // SqlCommand cmd, Instanziierung wie oben SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); // "generisch" da.Fill(ds); // Adapter füllt DataSet
Erwartungsgemäß stellt ADO.NET auch eine enge Verbindung zu XML her: DataSet bietet Möglichkeiten für die XML-(De-)Serialisierung und die Manipulation durch das XML Document Object Model (DOM). Mit Blick auf schnelleres Remoting unterstützt ADO .NET 2.0 nun auch ein binäres XML-Format und die Serialisierung von DataTable-Objekten. Eine wesentliche Neuerung ist zudem das einfache Hin und Her zwischen DataReader- und DataSet-Objekten. Command-Objekte Command-Objekte sind providerspezifisch. Sie werden auf der Basis einer Verbindung angelegt und können ihrerseits DataReader-Objekte erzeugen: // Verbindung zum Server SqlConnection sConn = new SqlConnection(cStr); sConn.Open(); SqlCommand sCmd = sConn.CreateCommand(); sCmd.CommandText = "SELECT * from ..."; SqlDataReader sRead1 = sCmd.ExecuteReader();
Die Alternative zu einem DataReader oder einer DataTable ist der direkte Aufruf von Command-Methoden wie Insert(), Update() und Delete().
schnell + kompakt
63
8 – ADO.NET 2.0
Datenquellensteuerelemente Datenquellensteuerelemente stellen eine Neuerung von .NET 2.0 dar. Ihre Verbindung zu einer Datenquelle ließe sich wohl als „halbspezifisch“ bezeichnen: SqlDataSource kommt auf der Seite des Datenanbieters beispielsweise mit Microsoft SQL Server-, OLE DB-, ODBC- und Oracle-Datenbanken zurecht, AccessDataSource ist davon abgeleitet und auf MS-Access optimiert. Datenquellensteuerelemente bieten neben Direktzugriffen (Insert, Update und Delete) unter anderem auch Sortier- und PagingFunktionen. Sie sind vor allem bei Web Forms ein einfacher Weg zur Verbindung eines datengebundenen Steuerelements mit einer Datenquelle. Datenprovider Microsoft liefert mit ADO .NET 2.0 vier .NET-Datenprovider, die in der Dokumentation auch als Managed Data Provider bzw. „verwaltete Datenanbieter“ erscheinen (alle in System.Data): 쐌 쐌 쐌 쐌
SqlClient (Client für MS SQL Server 7.0/2000 und 2005) SqlServerCe (Client für den CE-Server) OleDb (Schnittstelle für alle OLE DB-Provider) Odbc (Schnittstelle für alle ODBC-Treiber)
Für MySQL, Oracle, DB2, Sybase, Informix und Ingres stellen andere Hersteller Datenprovider zur Verfügung. Tipp: Für Firebird, MySQL und PostgresSQL sind diese Provider Open Source.
8.2 Neuerungen Über die bereits genannten Änderungen hinaus hat sich mit dem Versionswechsel einiges getan – vor allem, weil ADO.NET 1.0 eine echte 1.0-Version mit großen konzeptuellen Änderungen ge-
64
Neuerungen
genüber dem COM-Vorläufer war und sich die meisten Bedürfnisse, denen Microsoft mit der Version 2.0 nun gerecht wird, erst im praktischen Umgang mit ADO.NET 1.0 herauskristallisierten. Die wichtigsten Neuerungen im Überblick: 쐌 Auflistung der verfügbaren SQL-Server-Instanzen (SqlDataSourceEnumerator) und Datenprovider (DbProviderFactories) und Auslesen von Datenbankschemata per Enumerator 쐌 Asynchrone Befehlsausführung (z.B. durch BeginExecuteReader() und BeginExecuteNonQuery()) 쐌 Blockweise Kopie und Import von Datensätzen (SqlBulkCopy) 쐌 Programmgesteuerte Änderung von Kennwörtern für SQL Server-Tabellen via ChangePassword() 쐌 Neues Transaktions-Framework (System.Transactions) für verteilte Transaktionen 쐌 DataTable als eigenständiges Objekt, das sich bei Bedarf auch aus einer Datenansicht heraus erstellen lässt 쐌 Zeilenstatussteuerung für DataSet- und DataTable-Objekte über SetAdded() und SetModified() 쐌 DataReader: neue Methode Load() zur direkten Ausgabe in ein DataSet- bzw. DataTable-Objekt. 쐌 DataView: neuer, schnellerer Algorithmus für die Aktualisierung 쐌 Provider-Fabriken (DbProviderFactories) verbessern die Abstraktion für ein providerunabhängiges Programmiermodell. 쐌 ConnectionStringBuilder-Klassen automatisieren das Zusammensetzen von Verbindungszeichenfolgen. 쐌 Und schließlich die bereits erwähnten Datenquellensteuerelemente als optionale Zwischenschicht (ObjectDataSource, SqlDataSource, AccessDataSource, XmlDataSource, SiteMapDataSource) Viele der Neuerungen sind auch auf neue Features speziell von SQL Server 2005 ausgerichtet:
schnell + kompakt
65
8 – ADO.NET 2.0
쐌 Benutzerdefinierte Datentypen, neue MAX-Datentypen, neuer XML-Datentyp 쐌 Snapshot-Isolationstransaktionen und Datenbankspiegelung (Failover) 쐌 Laufzeitstatistikabrufe 쐌 DataReader-Objekte können sich eine Verbindung teilen 쐌 Optionale Benachrichtigung bei Änderungen in der Datenbasis Tipp: SQL Server Management Studio … … ist ein Gratistool von Microsoft, das eine komfortable Oberfläche zur Verwaltung von SQL Server 2005-Datenbanken bietet.
66
KAPITEL 9 Web Services 2.0 9.1
Neuerungen im Überblick
68
9.2
Webdienstdeklaration per Schnittstelle
69
9.3
WSE 3.0
70
Bei Webdiensten, einer aufgrund der verwendeten Dateinamenserweiterung oft schlicht auch als ASMX bezeichneten .NET-Technologie, geht es um verteilte Anwendungen, die wie Web Forms im ASP.NET Runtime Host laufen, aber kein HTML ausliefern, sondern von Clients abrufbare Dienste anbieten, kurz gesagt: um Funktionen mit Fernaufruf. Clients handhaben den Aufruf von Webdiensten weitgehend transparent über Stellvertreterobjekte, so genannte Proxies, wobei der Transfer der Funktionsparameter und -ergebnisse mit dem Simple Object Access Protocol (SOAP) abgewickelt wird. .NET arbeitet ausschließlich mit SOAP-Implementationen auf der Basis von HTTP 1.1 und unterstützt alle vier SOAP-Formate: document und rpc jeweils gepaart mit literal oder encoded. Die auf XML-Basis speziell für Webdienste konzipierte Beschreibungssprache WSDL ermöglicht die genaue Charakterisierung von Webdiensten hinsichtlich Speicherort, Datentypen, Nachrichten (Parameter, Ergebnisse), Aktionen (Operationen) und Bindung. WSDL-Dokumente bilden darüber hinaus die Grundlage für Verzeichnisdienste – sozusagen Gelbe Seiten im Internet –,
schnell + kompakt
67
9 – Web Services 2.0
über die sich Dienste im Internet ausfindig machen und letztlich auch kommerziell verwerten lassen.
9.1 Neuerungen im Überblick 쐌 Unterstützung des neuen auf SOAP 1.1 aufsetzenden W3CStandards SOAP 1.2 (serverseitig nun auch die Voreinstellung). 쐌 Konformität mit dem WS-I Basic Profile 1.1 – das Basic Profile der Web Services Interoperability Organization (WS-I.org) wird von allen Webdienst-Herstellern unterstützt und stellt eine Art Sammlung von Standards dar, die das plattformunabhängige Arbeiten ermöglichen und die Interoperabilität zwischen Webdiensten verbessern. Zu den Standards gehören UDDI, WSDL, SOAP, XML 1.0 und XSD. Für die (optionale) Konformitätsprüfung gibt es das Attribut [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]) 쐌 Gemeinsame Typnutzung für Webdienste – die neue /shareTypes-Option für wsdl.exe eröffnet die Möglichkeit, identische Datentypen für die gemeinsame Nutzung durch mehrere Dienste nur einmal zu definieren. 쐌 Möglichkeit der Implementation eigener Serialisierungslogiken über die neue IXmlSerialize-Schnittstelle 쐌 Client-Proxy-Klassen arbeiten mit Eigenschaften anstelle von Feldern. 쐌 Verändertes Modell für asynchronen Aufruf – bei Anlegen eines Verweises für einen Webdienst Xxx werden nun anstelle von BeginXxx() und EndXxx() die Methoden XxxAsync(), CancelAsync() und das Ereignis XxxCompleted() generiert. 쐌 Die neue Klasse SchemaImporterExtension ermöglicht einen Eingriff in die Codeerzeugung beim Schemaimport, wie er bei der Erstellung von Webdienstproxies während der Operation Webverweis hinzufügen erfolgt.
68
Webdienstdeklaration per Schnittstelle
쐌 Die neue Klasse HttpListener vereinfacht das Hosting von Webdiensten. 쐌 Beschleunigte XML-Serialisierung durch statische Serialisierungsassemblies – standardmäßig generiert .NET Serialisierungsassemblies für Clients dynamisch. Mit dem neuen Werkzeug sgen.exe lassen sich beständige Serialisierungsassemblies generieren (in Visual Studio über Seite Projekteigenschaften/Erstellen konfigurierbar).
9.2 Webdienstdeklaration per Schnittstelle Das ASMX-Framework 2.0 erlaubt auch die reine Deklaration von Webdiensten über die normalen Webdienstattribute aus dem Namensraum System.Web.Services. Die .NET-Implementation einer solchen Schnittstellenklasse stellt dann effektiv auch die Implementation der so getroffenen Vereinbarungen: using System.Web.Services; [WebServiceBinding( Name = "QuoteService", Namespace = "http://example.org/stocks", ConformsTo = WsiProfiles.BasicProfile1_1, EmitConformanceClaims=true)] public interface IQuoteService { [WebMethod] ...
schnell + kompakt
69
9 – Web Services 2.0
9.3 WSE 3.0 Die kostenfrei von Microsoft herunterladbaren Web Services Enhancements (WSE) konzentrieren sich auf die Entwicklung und Weitergabe sicherer Webdienste, bei denen die Kommunikation verschlüsselt und digital signiert wird (Kerboros-Tickets, Zertifikate nach X.509 sowie selbst definierte Signaturen für XML und/ oder Binärdaten). Des Weiteren sind ein auf Benutzerrichtlinien basierendes Sicherheitsmodell für Webdienste und die Authentifizierung über Benutzername/Passwort mit von der Partie sowie die Möglichkeit zum Erstellen von Diensten, die ihrerseits Zertifikate ausgeben bzw. die Gültigkeit von Zertifikaten überprüfen. WSE integriert sich bei der Installation in Visual Studio 2005 (wobei die Produkte der Expresslinie ein separates Verwaltungstool benötigen) und setzt serverseitig die Version 2.0 der .NET-Laufzeitumgebung voraus. Weitere wesentliche Punkte sind: 쐌 Unterstützung von ASP.NET-Webdiensten, die nicht vom IIS gehostet werden, beispielsweise Windows-Systemdienste, Konsolenanwendungen (oder gar COM+-Anwendungen) 쐌 Nicht auf TCP/IP beschränkt, UDP oder SMTP sind genauso möglich 쐌 Sicherer Transport großer binärer Datenmengen mit dem W3C SOAP Message Transmission Optimization Mechanism (MTOM) 쐌 64-Bit-Plattformen werden unterstützt. 쐌 Die parallele Installation zu WSE 2.0 (für NET 1.1) ist problemlos möglich.
70
KAPITEL 10 Compact Framework 2.0 10.1 Visual Studio 2005
71
10.2 Die Emulatoren …
71
10.3 Features des CF 2.0
73
10.4 SQL Server CE
74
10.1 Visual Studio 2005 Das Flaggschiff von Microsoft bietet nun auch Unterstützung für native C++-Anwendungen und ersetzt damit das Produkt eVC++. Auch die von dort bekannten Remote-Werkzeuge sind integriert. Damit ermöglicht Visual Studio 2005 die komplette mobile Anwendungsentwicklung in einem Werkzeug. Da die im Umlauf befindlichen Geräte alle noch das CF 1.0 im ROM haben, gibt es sowohl für CF 1.0 als auch für CF 2.0-Anwendungen eine Projektvorlage. Interessant: Der Formulardesigner zeigt jetzt einen Emulator um das Formular herum an.
10.2 Die Emulatoren … … wurden in Design und Funktion erheblich verbessert. Statt der bisherigen x86-Images gibt es nun ARM-Images, die die Geräte nicht nur realitätsnäher abbilden, sondern auch über ActiveSync mit dem Desktop kommunizieren können, und das neuerdings auch unter Microsoft Virtual PC. Mit dabei sind nun zusätzlich
schnell + kompakt
71
10 – Compact Framework 2.0
vier Emulatoren für Pocket PC 2003 SE (Standard, Quadratisch, QVGA und VGA) sowie zwei Emulatoren für SmartPhone 2003 SE (Standard und QVGA) und im Rahmen des Windows Mobile 5.0 SDK auch Emulatoren für die Geräte der nächsten Generation.
Abb. 10.1: Der neue Pocket PC 2003 SE Quadratisch Emulator
72
Features des CF 2.0
10.3 Features des CF 2.0 쐌 schlanke 4,5 MByte 쐌 unterstützt Authenticode-Signatur für CAB-Dateien 쐌 hohe Abwärtskompatibilität – im Prinzip sollte jede CF 1.0Anwendung auch mit CF 2.0 funktionieren. Die beiden Versionen des CF können auch koexistieren. 쐌 Leistungsgewinne durch neuen JIT-Compiler 쐌 CF 2.0 lässt sich auf Pocket PC mit Windows Mobile 2003 nachinstallieren (nicht jedoch auf SmartPhone) und wird bei Geräten mit Windows Mobile 5.0 im ROM integriert sein. 쐌 Neue Steuerelemente: DateTimePicker, Splitter, WebBrowser 쐌 Unterstützt alle neuen Sprachfeatures (àKap. 3). Die My-Funktionalität von VB ist aber eingeschränkt auf die Objekte My.Resources, My.WebServices und My.Forms. 쐌 Visual Inheritance – Ableitungen von Formularen sind möglich. 쐌 Die Entwicklung eigener Steuerelemente ist nun auf der Basis von UserControl möglich. 쐌 Unterstützung für Landscape-Modus. 쐌 Unterstützung von COM-Interop in der Richtung COM zu .NET, jedoch kein ActiveX-Control-Hosting 쐌 P-Invoke: Rückrufe per Delegat sind nun möglich; vereinfachtes Strukturlayout und Marshalling durch neues MarshalAsAttribut. 쐌 ADO .NET 쐌 Unterstützung für typisierte DataSet-Objekte 쐌 DataTable implementiert nun auch IXmlSerializable, lässt sich damit separat als XML-Dokument schreiben und lesen. 쐌 Ressourcenschonende Alternative zu DataSet ist SqlCeResultSet, ein frei positionierbarer, updatefähiger Cursor mit Datenbinding.
schnell + kompakt
73
10 – Compact Framework 2.0
쐌 XML 쐌 XPath-Unterstützung durch die Klasse XmlNode 쐌 In System.Security.Cryptography finden sich weitere Verschlüsselungsalgorithmen für Signaturen und Hash-Werte, darunter DSA, MD5, (Triple-)DES, SHA1, RSA und Rijndael.
Was weiterhin fehlt … … ist eine Unterstützung für ASP.NET, .NET Remoting und Codezugriffsicherheit.
10.4 SQL Server CE Am Rande notiert: Microsofts mobile Datenbank SQL Server CE wird nun von SQL Mobile, der kleinen Schwester des SQL Server 2005, abgelöst. Sie zeichnet sich durch einfachere Verwendung und bessere Integration mit Entwicklungs- und Verwaltungstools aus und führt auch den Cursor wieder in die .NET-Welt ein. Um SQL Mobile zu nutzen, ist eine Anmeldung bei MSDN-Connection notwendig.
74
ANHANG .NET-Grundlagen A.1 Der Ansatz
75
A.2 Konzeption
77
A.3 Die wichtigsten Komponenten
80
A.1 Der Ansatz Die weltumspannende Vernetzung durch das Internet birgt Sicherheitsrisiken, denen die Win32-API aus immanenten Gründen nichts entgegensetzen kann: Die dort verwendete C-Aufrufkonvention öffnet bösartigem oder auch nur fehlerhaftem Code Tür und Tor für Zugriffe auf fremde Daten- und sogar Codebereiche; die nachträglich eingeflickten Sicherheitsmechanismen für Systemressourcen bieten nur wenige, grobe Abstufungen, die sich zudem leicht aushebeln lassen. Obwohl die zwischendurch aufkeimende COM/DCOM-Technologie einen gewissen Fortschritt in Richtung Objektorientierung bedeutete, brachte sie selbst nach ihrer Weiterentwicklung zu ActiveX kaum Antworten für die Sicherheitsproblematik. Erst mit COM+ gab es Fortschritte in diese Richtung, doch dieser Ansatz wurde durch das parallel entwickelte weitaus größer skalierende .NET überrollt. .NET ist nur auf den ersten Blick eine direkte und inzwischen wohl auch unmissverständliche Antwort von Microsoft auf Java, die erste objektorientierte Programmiersprache mit integrierter Sicherheitsphilosophie. Auf den zweiten Blick ist die Technolo-
schnell + kompakt
75
Anhang – .NET-Grundlagen
gie auch Ausdruck eines Paradigmenwechsels, der bereits mit den Konzepten P-Code und der Visual Basic Runtime im eigenen Hause gut vorbereitet war. Zum Durchbruch brauchte es lediglich die (mit Java gewonnene) Erkenntnis, dass die beiden Konzepte in Verbindung eine neue Zwischenschicht ergaben, in der letztlich auch die Antworten auf die genannte Sicherheitsproblematik stecken.
Anforderungen Gefordert war eine moderne Dachtechnologie, die alle Fliegen mit einer Klappe erschlägt. Sie sollte bereits Erreichtes ebenso integrieren wie Erwünschtes: 쐌 Weitgehende Sprach-, Betriebssystem- und Hardware-Unabhängigkeit durch Zwischencode-Architektur, kombiniert mit der Performance hoch optimierten, kompilierten Codes 쐌 Vollständige Objektorientierung – OOP steht für ein reichhaltiges Typsystem mit der Möglichkeit zur Typreflektion und Implementierungsvererbung 쐌 Komponentendesign – die (auch unter dem Gesichtspunkt der Vererbung) sprachunabhängige Wiederverwendung von Code 쐌 Umfangreiche objektorientierte Laufzeitbibliothek 쐌 Strenge Laufzeitumgebung mit umfangreichen Befugnissen bei der Typverwaltung und der Durchsetzung von Sicherheit, die bis in die Codeausführung hineinreicht 쐌 Typsicherheit – semantische Abgeschlossenheit der Implementierung von Datentypen, die mit einem Verzicht auf explizite Adressoperationen und Zeiger erkauft wird 쐌 Ausführungssicherheit – formale Garantie, dass ein Programm zur Laufzeit keinen Unsinn anstellen kann, selbst wenn es bösartig ist
76
Konzeption
쐌 Codezugriffssicherheit – fein granulierte Vergabe von Berechtigungen an Code aufgrund von Sicherheitsmerkmalen (Herkunft, Signierung, Zertifizierung) Dass sich dieser Berg an Aufgaben nicht mit einer neuen Programmiersprache allein bewältigen lässt, sondern eben auch die gesamte Landschaft drum herum involviert, dürfte genauso offensichtlich sein wie der Umstand, dass nur ein Global Player mit dem Atem und der Marktmacht von Microsoft überhaupt eine Chance hatte, ein derart monumentales Vorhaben umzusetzen.
A.2 Konzeption Als bloße Sandbox wie eine virtuelle Java-Maschine lässt sich .NET nicht mehr beschreiben. .NET ist als vollständige funktionale Umhüllung des Betriebssystems konzipiert, als Betriebsystem über dem Betriebssystem. In künftigen Windows-Versionen wird .NET zum System an sich und macht damit eine ähnliche Entwicklung durch, wie Windows selbst hinter sich hat – vom System über DOS zum eigenständigen System.
Sprachvielfalt .NET hat deshalb zwar mit dem speziell dafür entwickelten C# eine „natürliche“ Programmiersprache, versteht sich aber vor allem als gemeinsame Plattform für beliebige Sprachen von Algol bis ZPL – immer vorausgesetzt, die jeweiligen Sprachen sind so umgebaut, teilweise auch beschnitten, dass sie den Forderungen des Systems nach Typsicherheit genügen. Ein typisches Beispiel dafür ist Visual Basic: Damit diese Sprache am .NET-Konzert teilnehmen konnte, war erst einmal ein weitgehender Umbau der Spezifikation nötig. Tatsächlich fiel er derart radikal aus, dass eingefleischte VB 6-Programmierer auf erhebliche Migrationsprobleme stießen.
schnell + kompakt
77
Anhang – .NET-Grundlagen
IL als gemeinsame Zwischensprache Ein .NET-konformer Sprachcompiler erzeugt keinen direkt ausführbaren Maschinencode, sondern Intermediate Language (IL) und damit echten Sprachcode – im Gegensatz zum Bytecode von Java, der zwar eine Semantik hat, aber so gut wie keine Syntax. IL-Code wird erst im zweiten Schritt und zwar komponentenweise unmittelbar vor der Ausführung auf dem Zielsystem von einem JIT-Compiler des .NET Frameworks in den Maschinencode der jeweiligen Plattform umgesetzt. Optionale Signierverfahren sorgen an dieser Bruchstelle zusammen mit überprüfbaren Codemerkmalen für Sicherheit, die optimale Plattformanpassung des JIT-Compilers sorgt für Effizienz.
Übergeordnetes Objektmodell Das .NET-Framework ist eine vollständig objektorientierte Umgebung, in der alle Einzelsprachen ein und dasselbe Objektmodell benutzen (müssen), welches unter anderem vorschreibt, dass die Sprachen alle ihre elementaren Datentypen aus einer gemeinsamen Klassenbibliothek beziehen und damit effektiv mit derselben Implementation dieser Typen hantieren. Elementare Datentypen und Vererbung Diese Forderung schafft die notwendigen strukturellen Voraussetzungen erstens für eine reibungslose Kommunikation zwischen Anwendungen bzw. Komponenten unterschiedlicher sprachlicher Provenienz. Es gibt keinen „VB-String“, der über eine Konvertierungsfunktion zu einem „C#-String“ wird, sondern ausschließlich die vom .NET-Framework angebotene Klasse System.String. Zweitens ermöglicht sie eine sprachunabhängige Vererbung: Wenn Sie mit VB.NET die Ableitung einer Klasse schreiben wollen, spielt es definitiv keine Rolle, ob die Klasse ursprünglich in C# oder irgendeiner anderen .NET-konformen
78
Konzeption
Sprache erstellt wurde. Im Gegensatz zu COM beschränkt sich .NET bei der Vererbung nicht nur auf Schnittstellen, sondern unterstützt eben auch die (einfache) Implementierungsvererbung. Jeder Datentyp eine Klasse In .NET ist jeder Datentyp eine Klasse und jeder Wert ein Objekt, zumindest formal. Das betrifft insbesondere auch alle elementaren Datentypen der .NET-Sprachen: Auch Integer und Boolean sind hier also Klassen, deren Objekte über Methoden verfügen. Das Objektmodell unterscheidet im Übrigen strikt zwischen zwei Arten von Datentypen, nämlich Wert- und Verweistypen.
Sicherheit … … ist bei .NET oberstes Gebot. Typsicherheit Die Forderung nach Typsicherheit setzt direkt an der Spezifikation der einzelnen .NET-Sprache an. Sie verbannt Zeiger und Adressoperationen und unterwirft alle damit zusammenhängenden Mechanismen (Array-Indizierung) strengen Einhaltungsvorschriften. Intern gibt es Zeiger und Adressoperationen natürlich weiterhin, sie werden aber vollständig auf das Typsystem abgebildet. (Verschiedene .NET-Sprachen wie C++ und C# erlauben das Konzept sogar noch explizit, wobei die Verwendung mit einer starken Beschränkung und Isolation des Codes erkauft werden muss.) Automatische Speicherverwaltung Der Typsicherheit ist eine der großen Errungenschaften von .NET zu verdanken: die für die Programmierung höchst angenehme, automatische Speicherverwaltung durch die .NET-Laufzeitumgebung. Dieser Mechanismus übernimmt effektiv jede
schnell + kompakt
79
Anhang – .NET-Grundlagen
Art von Speichervergabe, -verwaltung, -organisation und -freigabe. Die in anderen Programmiersprachen gefürchteten Speicherlecks und Zugriffe ins Leere sind in .NET endgültig Geschichte. Ausführungssicherheit Ein „Absturz“ unter .NET ist grundsätzlich ein geregelter Vorgang, der sich ausnahmslos auf semantische Ursachen wie unbehandelte Ausnahmen und Endlosschleifen zurückführen lässt – im Gegensatz zur klassischen Anwendungsprogrammierung, die als Folge von Logikfehlern auch mit undefinierten Systemzuständen rechnen muss, welche ihrerseits andere Anwendungen oder gleich das ganze System instabil werden lassen. Kurz: .NETAnwendungen können sich im Gegensatz zu klassischen Anwendungen nicht gegenseitig in die Suppe spucken oder gar zum Absturz bringen. Codezugriffssicherheit Die anderen Bausteine des Sicherheitskonzepts laufen auf das für Windows NT entwickelte richtlinienbasierte Sicherheitsmodell hinaus. Der Code wird zum einen über formale Kriterien wie Sicherheitszonen (Herkunft) und explizite Vertrauenseinstufungen (Stichwort: rollenbasierte Sicherheit), zum anderen über Sicherheitsmerkmale wie Signierung oder Herstellerzertifikate klassifiziert. Was der Code einer Anwendung vom System zu sehen bekommt, welche Zugriffsrechte auf welche Ressourcen er erhält, ist von dieser Klassifizierung abhängig.
A.3 Die wichtigsten Komponenten Als Rahmentechnologie umfasst .NET eine Vielzahl einzelner Aspekte, Modelle, Spezifikationen, Mechanismen und letztlich Code-Komponenten. Die folgenden Abschnitte stellen die wich-
80
Die wichtigsten Komponenten
tigsten dieser Komponenten einzeln vor und beleuchten ihr Zusammenspiel.
Common Type System (CTS) Das CTS ist die konkrete Fassung des .NET-Objektmodells: Es definiert die .NET-Basisklassen als Grundlage aller Datentypen (auch der integrierten Datentypen der einzelnen .NET-Programmiersprachen) auf der Ebene der Intermediate Language (IL). In dieser maschinennahen Zwischensprache liegen alle Datentypen vor, die eine .NET-Anwendung bzw. eine .NET-Codekomponente einbindet. Da jeder einzelsprachliche .NET-Quellcode ebenfalls in IL übersetzt und damit zu einem Teil des CTS wird, ist das Common Type System der Dreh- und Angelpunkt sämtlichen .NET-Codes. Der (.NET-)Namensbereich System definiert unter anderem elementare und systemnahe Datentypen wie Int, Int32 und UInt16. .NET-Sprachen integrieren diese Datentypen im Allgemeinen durch schlichtes Umbenennen ohne jede weitere Indirektion, weshalb diese Sprachen nicht nur mit identischen Datentypen, sondern auch mit identischen Implementationen davon arbeiten. Damit das funktioniert, muss die CTS-Spezifikation äußerst präzise festlegen, was der Compiler einer .NET-Sprache vorfindet, was er zu liefern hat und wie die Datentypen spezifisch in Hinblick auf Vererbung zusammenspielen. Der dazu notwendige Umbau der Spezifikation existierender Sprachen wie C++ und VB war vermutlich der größte einzelne Kraftakt, den Microsoft auf dem Weg zu .NET vollbringen musste. (Ganz ohne Schrammen ging es nicht ab: VB-Programmierer mussten sich wie schon gesagt gewaltig umgewöhnen, die für C++ eingeführten verwalteten Erweiterungen werden von vielen als endgültige Überfrachtung der Sprache gesehen.)
schnell + kompakt
81
Anhang – .NET-Grundlagen
Rolle des Datentyps System.Object Wie bereits erwähnt, legt das CTS auch die Regeln für die Vererbung fest. Das .NET-Objektmodell ist hierarchisch organisiert, es hat seinen Ausgangspunkt in System.Object, dem allgemeinsten aller Datentypen, von dem alle anderen Datentypen direkt oder indirekt abgeleitet sind, weshalb sie bei Bedarf auch als schlichtes Objekt gehandhabt werden können (siehe Abb. A.1). Datentyp (System.Object) Werttypen (System.ValueType) In die Sprache integrierte Werttypen (int, bool etc.) .NET-Werttypen (System.Int32, Point, Recangle etc.) benutzerdefinierte Werttypen (struct) Aufzählungstypen (System.Enum) .NET-Aufzählungstypen (System.Int32, etc.) benutzerdefinierte Aufzählungstypen (enum) Verweistypen deklarierte Datentypen .NET-Schnittstellen (System.IFormattable etc.) benutzerdefinierte Schnittstellen (interface) benutzerdefinierte Zeigertypen (*-Operator; unsafe) implementierte Datentypen Arrays (System.Array) Delegaten (Funktionszeigerprotot.; System.Delegate) .NET-Delegaten (System.EventHandler etc.) benutzerdefinierte Delegaten (delegate, event) Klassen Boxing-Klassen (als Verweistypen verpackte Werttypen) .NET-Klassenhierarchie (für Einzelsprache sichtbar) benutzerdefinierte Klassen (class) Legende systematische Kategorie
.NET-Kategorie
Abb. A.1: Das CTS im Überblick
82
benutzerdef. C#-Kategorie
Die wichtigsten Komponenten
Werttypen und Verweistypen Auf der Ebene der Einzelsprachen unterscheidet das CTS in nie da gewesener Klarheit zwischen Wert- und Verweistypen, also echten Werten und Referenzen darauf. Werttypen, deren Werte auf das von C her bekannte Strukturkonzept zurückgehen, bilden die Grundlage für die Implementierung der Verweistypen (hinter denen sich letztlich das altbekannte Zeigerkonzept verbirgt). Für den Zweig der Verweistypen unterscheidet das Modell weiter zwischen Schnittstellentypen und Datentypen mit konkreter Implementation: Arrays, Klassen und Delegaten (d.h. streng typisierten Funktionszeigern). Typreflektion Über den Mechanismus der Typreflektion sind Laufzeittypinformationen zu jedem Objekt abrufbar.
Common Language Specification (CLS) Die CLS versteht sich als eine Art kleinster gemeinsamer Nenner für das Zusammenspiel zwischen verschiedenen .NET-Sprachen: Sie schreibt unter anderem vor, welche elementaren Datentypen eine Sprache mindestens unterstützen muss, um beispielsweise mit der .NET-Klassenhierarchie ohne Einschränkungen zu arbeiten. (Codekomponenten, die nicht CLS-konforme Datentypen außerhalb der Implementation verwenden, sind ohne weiteres möglich, aber in der Praxis selten, weil man sie nur von der Sprache aus verwenden kann, in der sie geschrieben wurden.) Zur Definition der Datentypen selbst kommen in der CLS Regelsätze hinzu: Eine CLS-konforme Codekomponente darf beispielsweise bei Bezeichnern keine Unterscheidung zwischen
schnell + kompakt
83
Anhang – .NET-Grundlagen
Groß- und Kleinschreibung erwarten oder bei ihren öffentlichen Methoden mit variablen Parameterlisten arbeiten.
Common Language Runtime (CLR) Dieser Begriff steht für die Laufzeitumgebung des .NET Framework. Die CLR übernimmt die meisten Verwaltungsaufgaben in Zusammenhang mit der Ausführung von .NET-Anwendungen. Darunter fallen das Typ-, Versions-, Prozessraum-, Speicher- und vor allem Sicherheitsmanagement. Die folgenden Abschnitte versuchen zumindest anzureißen, was unter diesen Schlagworten zu verstehen ist. Gemeinsame Typverwaltung Die .NET-Typverwaltung vermeidet die in einem Jahrzehnt der Arbeit mit COM als Schwächen erkannten Punkte weitgehend. Die als Assemblies bezeichneten zwischensprachlichen CodeDateien der .NET-Typen enthalten neben dem Code auch alle Typinformationen in Form des so genannten Manifests und sind damit selbst beschreibend. Das heißt, die Windows-Registrierung bleibt außen vor, .NET verwendet anstelle zentraler (installationsabhängiger) Einträge eine ausgeklügelte Typauflösungsstrategie, die ein buntes Nebeneinander aus privaten und gemeinsam genutzten Codekomponenten gestattet und die Koexistenz verschiedener Versionen von Datentypen bzw. CodeKomponenten explizit vorsieht. Gemeinsam genutzte Codekomponenten werden in einem Pool verwaltet. Die Typverwaltung der CLR arbeitet auf der Basis von Namensräumen – einem strukturierten (nicht: hierarchischen) Benennungsschema für Datentypen, das vom tatsächlichen Speicherort abstrahiert und so möglichen Versionskonflikten aus dem Weg geht. Die Typauflösung geschieht zur Laufzeit – erst dann wird die Zuordnung zwischen einzelnen, über Namensräume qualifi-
84
Die wichtigsten Komponenten
zierten Typbezeichnern und der physischen Implementation eines Datentyps endgültig festgelegt. Assemblies Assemblies sind Codekomponenten in IL als Ergebnis einer Kompilierung in Form einer .EXE-Datei (.NET-Anwendung, mit einem „Stub“ als Startprogramm) bzw. einer DLL (Implementation von Datentypen). Sie enthalten im Wesentlichen drei Abschnitte: (IL-)Code, Ressourcen und ein Manifest, d.h. die Selbstbeschreibung (u.a. die vollständige Typinformation für die Laufzeittypreflektion) in Form von Metadaten. Gemeinsam genutzte Assemblies – zu denen in erster Linie die DLLs der .NET-Laufzeitbibliothek und ihre Erweiterungen zählen – fasst die .NET-Typverwaltung logisch im so genannten Global Assembly Cache (GAC) zusammen, der im Windows Explorer als virtueller Ordner \windows\assembly erscheint. Hinter assembly verbirgt sich eine Ordnerhierarchie, deren nach Versionsnummern geordnete Äste unter anderem die Koexistenz gleichnamiger Dateien mit verschiedenen Versionsnummern möglich machen. Installationen in den GAC geschehen über eigene Werkzeuge von .NET und sind nur für Assemblies mit so genannten starken Namen möglich, die ihrerseits über ein anderes Tool erzeugt werden. Die Identität einer Assembly ergibt sich aus ihrem Textnamen, der Versions- und Kulturinformationen und einem starken Namen, das heißt: dem öffentlichen Teil einer digitalen Signatur. Auf diese Weise lassen sich Verwechslungen ansonsten gleichnamiger Assemblies verschiedener Hersteller oder Versionen zuverlässig vermeiden. Codeverwaltung Die Codeverwaltung der CLR läuft unbemerkt im Hintergrund ab und entzieht sich weitgehend der Kontrolle des Programmierers. Nach der Typauflösung tritt der Assembly-Loader in
schnell + kompakt
85
Anhang – .NET-Grundlagen
Aktion, der seinerseits Maßnahmen zur Prüfung der Codezugriffssicherheit gemäß der der .NET-Laufzeitsicherheitsrichtlinie trifft und dem in der Assembly enthaltenen Code einen Berechtigungssatz zuteilt. Er beschreibt, welche Operationen der Code und die von ihm wieder gebundenen Assemblies ausführen dürfen. JIT-Kompilierung Da Assemblies nur im IL-Code weitergegeben werden, ist zu ihrer Ausführung ein weiterer Übersetzungsschritt erforderlich – durch einen JIT-Compiler, der als fester Bestandteil der CLR für die Umsetzung in plattformspezifische Maschinenbefehle zuständig ist – immer vorausgesetzt, der Code wurde als vertrauenswürdig eingestuft. Hierfür gibt es grob zwei Strategien: JITKompilierung unmittelbar bei Aufruf und JIT-Kompilierung bei Installation. Die erste Strategie ist für private, die zweite für gemeinsam genutzte Assemblies vorgesehen.
Ausführung Die Ausführung von .NET-Code geschieht wie üblich im Kontext eines Prozesses, welcher der Anwendung einen eigenen Adressraum (bisher: 4 GByte) zur Verfügung stellt. Aufgrund der für verwalteten .NET-Code garantierten Ausführungssicherheit spricht aber auch nichts dagegen, dass sich mehrere Anwendungen einen Prozessraum, teilen, was deutliche Geschwindigkeitsvorteile in Bereichen wie Runtime Hosting und anwendungsübergreifende Kommunikation bringt. Anwendungsdomänen Zur Anwendungsisolation (Sicherheit) in einem Prozessraum arbeitet das .NET-Ausführungsmodell mit dem Konzept der Anwendungsdomäne. Das heißt, .NET-Code läuft immer im Kontext
86
Die wichtigsten Komponenten
einer Anwendungsdomäne. In dieser Ausführungsumgebung erfolgt insbesondere die Instanziierung der Datentypen als solche (Typauflösung, Version). Die statischen Elemente eines Datentyps sind in dieser Umgebung demnach eindeutig. Obwohl eine Anwendungsdomäne im Normalfall einen Thread umfasst (nämlich den primären Thread des Prozesses), gibt es weder in der einen noch in der anderen Richtung einen Eins-zu-eins-Zusammenhang. Eine Anwendungsdomäne kann mehrere Threads umfassen (gewöhnliches Multithreading), ein einzelner Thread kann aber auch neue Anwendungsdomänen anlegen, Anwendungen darin starten und mit diesen Anwendungen kommunizieren. Speicherverwaltung und Garbage Collector Als verwaltete Umgebung für Sprachen ohne explizites Zeigerkonzept muss die CLR eine Speicherverwaltung für den Heap bereitstellen, die den Speicher auf der Ebene einzelner Objekte zuteilt und effizient organisiert. Für die Freigabe zugeteilten Speichers (und die dabei anfallenden Umschichtungen) ist der so genannte Garbage Collector (GC) – zu Deutsch „Freispeicherverwaltung“ – zuständig. Er stellt einen asynchronen – das heißt, in einem eigenen System-Thread ausgeführten – Mechanismus dar, der in seinen Läufen die nicht mehr benötigten Objekte freigibt und dabei entstehende Lücken durch Umschichtung schließt. Das Prinzip des Mechanismus ist verblüffend einfach. Der GC geht schlicht den Verweisen aller Variablen im aktuellen Geltungsbereich (das sind die Variablen auf dem Stack) in einer Art Tiefensuche nach und findet so die Objekte heraus, die noch gebraucht werden. Objekte, zu denen kein Verweis mehr existiert, werden am Ende eines Laufs auch „physisch“ zerstört.
schnell + kompakt
87
Stichwortverzeichnis .NET 1.x Kompatibilität zu 10 .NET Compact Framework 2.0 43 .NET Framework 2.0 Varianten 10 .NET Framework Redistributable 2.0 18 .NET Framework SDK 2.0 18 .NET-Klassenbibliothek 2.0 33 32-Bit-System 10 64-Bit .NET 1.x 10 Migration 10 Plattformen 9, 10, 33 Prozessoren 10
A Access Control Lists 35 Accessoren, Sichtbarkeiten für 23 ACL 35 Active Server Pages 53 adaptives Rendering 54, 55 ADO .NET 2.0 61 Szenarien 21 Aktivierungsmodell 36 Aliasnamen für Verweise 15 Allgemeine Steuerelemente 42 ALM-Zyklus 22 Änderungsmanagement 22 anonyme Methoden 23, 28 Anwendungsdomäne 86 Anwendungseinstellungen 48, 49 Application (My) 30
schnell + kompakt
Application Life Management 22 ASMX 67 ASP.NET -Entwicklungsserver 59 Runtime Host 67 ASP.NET 2.0 53 Kompilieren von Anwendungen 59 Assemblies 9, 14 Namenskonflikte 15 Assemblies-Attribute 20 Assembly 84, 85 Assembly Download Cache 14 AssemblyInfo.cs 20 Assemblyinformationen 20 asynchron Befehlsausführung bei ADO 65 Ping 37 Webdienste 68 Audio (My) 30 Ausführungssystem 9 Ausrichtung von Steuerelementen 48 Ausrichtungslinien 48 Authenticode-Signatur 73 Authentifizierte Streams 35 Authentifizierung 70 ohne Cookies 58 -protokolle 35 AutoSize 43 Avalon 41
B BackgroundColor 39
89
Stichwortverzeichnis
BackgroundWorker 43 Basic Profile der Web Services Interoperability Organization 68 bearbeiten und fortsetzen 21 Beep() 39 BeginExecuteNonQuery() 65 BeginExecuteReader() 65 Benutzersicherheit 11 Berechtigungssatz 11 errechnen 13 Berichte 19 binäres XML-Format, ADO 63 Biztalk Server 2006 17 Bulk Copy 65 Business Activity Monitoring 17
C C# 77 C#, Spracherweiterungen 28 C++ 24 Caching 59 Cassini 59 CatalogParts 57 CatalogZone 57 CF 2.0 71 ChangePassword() 65 Click Once Aktivierungsmodell 36 Anwendungen 20 Deployment 13, 14, 20 Client-Server-Anwendungen 19 Clipboard (My) 30 Clock (My) 30 CLR 84 CLS 83 Codeanalyse 19 Codeänderungen, Anzeige von 21 Codeausschnitte 21 Codebehind 59
90
Datei 26 Formulardesigner 45 Modell 58 CodeFile 58 Codegruppenzugehörigkeit 11 Codeherkunft 11 Codesicherheit 11 Codeumgestaltung 20 Codeverwaltung 85 Codezugriffssicherheit 20, 74, 77, 80 COM 53, 61, 75 ADO 65 InProc-Server 10 Interop 20, 36 CF 2.0 73 Command 61, 63 Common Type System 81 Community Foren 20 Compact Framework 2.0 71 Computer (My) 30 ConnectionStringBuilder 65 Container 43 ContextMenuStrip 42 Continue 32 Coprozessor 10 CriticalHandle 36 CTS 81 CType 32 CursorVisible 39
D Data Protection API 35 DataAdapter 63 DataGrid 44, 54, 57 DataGridView 44 DataReader 61, 62 Load() 65 DataSet 61, 63 CF 2.0 73 Zeilenstatus 65
Stichwortverzeichnis
Dataset 62 DataTable 62 CF 2.0 73 Zeilenstatus 65 DataView 65 Dateisystem 31 Datenabnehmer 61 Datenadapter 61 Datenbankspiegelung 66 Datenbankzugriffe 62 über SQL-Client 12, 13 Datenpräsentation 44 Datenprovider 61 Datenquelle 61 -steuerelemente 62, 64 Datensätze blockweise kopieren 65 Datenzugriff 18, 61 verbindungsloser 62 DB2 64 DbProviderFactories 65 Debugger 21 Delete 61, 63 Deployment 13 Designer 45 Strip 46 Designvorgaben, einheitliche 58 Designvorlagen 54 DetailsView 57 DirectCast 32 Disk Output Cache 59 Dll-Format 14 Dokumentgliederung 50 DOM 63 DPAPI 35 Drag & Drop-Datenbindung 21 Dreieckssymbol 47
E EditorParts 57 EditorZone 57
schnell + kompakt
Einzelsprachen, Erweiterungen der 23 E-Mail versenden per SMTP 38 Emulatoren 71 Entwicklungsumgebung 17 eVC++ 71 Exe-Format 14 Express-Editionen (VS2005) 18
F Failover 66 Farbmarkierung 21 FCL 2.0 33 COM Interop 36 Data Protection API 35 Zertifikatsverwaltung 36 FileSystem (My) 30 FileUpload 58 Firebird 64 Fließkommagenauigkeit 10 FlowLayoutPanel 43 ForegroundColor 39 Forms (My) 30 Formulardesigner 45 FormView 57 Framework Class Library 33 Freispeicherverwaltung 87 Friend-Deklarationen 15 FrontPage Extensions 59 FTP-Clientanforderungen 37 FullTrust 12, 13 Funktionszeiger 28
G GAC 85 GAC-Assemblies, Berechtigungssatz 13 Garbage Collector 87 GC 87 Gemeinsame Typnutzung, Webdienste 68
91
Stichwortverzeichnis
Generics 23, 38 Nullable 27 where-Klausel 26 Get/Set-Sichtbarkeit 23 GetGenericArguments() 38 GetValueOrDefault() 27 Global Assembly Cache 85 GridView 57 GUID, automatischer 20
H HasValue 27 Herstellerzertifikat 11 HiddenField 58 Hosting-Prozess, für Ausführung mit partiellem Vertrauen 13 HttpListener 37, 69
I IDE 17 Identity-Berechtigungen 13 IEnumerator 29 IIS 59 ImageMap 58 Informix 64 Ingres 64 Insert 61, 63 In-situ-Beschriftung 45, 47 Installationspakete 13 Intellisense Codeausschnitte 21 Proxyklassen, Anzeige von 31 XML-Kommentare (VB) 32 Intermediate Language 78 InternalsVisibleTo 15 IP-Adresse, Rückmeldung von Änderungen 37 IPv6 37 Remoting 38 IsGenericType() 38
92
Isolationstransaktionen 66 Itanium-Prozessoren (IA64) 10 Iteratoren 23, 29 IXmlSerialize 68
J J# 28 J#-Redistributable 2.0 18 Jit-Compiler 11 JSP 53 Just-in-time-Compiler 9
K Kennwort 11 ASP.NET 55 SQL 65 zusendung 54 Kerboros-Tickets 70 Keyboard (My) 30 knappe Ressourcen 22 Kompilieren von ASP.NET 2.0Anwendungen 59 Komponenten 43 Komponentendesign 76 Konsolenanwendungen 39 Konvertierungsassistent 51
L Landscape Modus 73 Laufzeitbibliothek 76 Laufzeitsicherheitsrichtlinie 11, 86 Laufzeitstatistik 66 Load() 65 Load-Testing 22 Login 54, 55 LoginView 55
M Managed C++ 24 Managed Data Providers 61, 64
Stichwortverzeichnis
Manifest 84 manifestbasiertes Aktivierungsmodell 36 MarshalAs 73 MaskedTextBox 42 Masterseiten 58 MAX-Datentypen 66 MenuItem 42 MenuStrip 42 Migration 51 Mobilbereich 19, 71 Mobile 5.0 SDK 72 MSDN Community Foren 20 MSI-Deployment 13 MTOM 70 My 30, 31 Funktionalität 23 Settings 48 Standardobjekte 31 MySQL 64
N Namensauflösung 15 Namensraum 84 Namensräume Aliasnamen für 15 NegotiateStream 35 NetworkChange 37 Netzwerkverbindungen 37 No-Touch Deployment (NTD) 13 nullbare Typen 23, 27
O Objektauswertung zur Laufzeit 21 Objektmodell 78 Objektorientierung 7 Odbc 64 Of 26 Offline-Verfügbarkeit 14
schnell + kompakt
OLE DB Provider 61 OleDb 64 OleDbDataReader 62 on the fly-Projekte 20 OOP 76 Operatorüberladung 32 Oracle 64
P Page 58 partial (Schlüsselwort) 26 partielle Typen 23, 26 Vertrauenswürdigkeit 12 PermCalc.exe 13 Permission-Exception 11 PHP 53 Ping 37 P-Invoke 10 CF 2.0 73 Plattformen 10 Pocket PC 2003 SE 72 Post Cache Substitution 59 PostgresSQL 64 PPC 72 Professional Edition (VS2005) 19 Profileigenschaften 58 Profiling 19 Projektdateien 59 Projekteigenschaften 20 Anwendung 20 Einstellungen 48 Erstellen 10, 69 Sicherheit 13 Veröffentlichen 14 Propertybinding 49 Providerfabriken 65 Proxies 67 Client- 68 My-Funktionalität 31
93
Stichwortverzeichnis
Netzwerk, automatische Suche im 38 Webdienste 68 Prozess 86
Q Quellcodemanagement 22 QueueUserWorkItem() 44
R ReadKey() 39 Refactoring 20 Registrierung 31 Reload() 50 Remote Server-basierte Lösungen 19 Remoting 38 Remoting, TCP/IP-Channelsicherheit 35 runat 53 Runtime Host ASP.NET 67 Runtime Hosting 86
S SafeHandle 36 Sandbox 77 Schemaimport 68 SchemaImporterExtension 68 Secure Sockets 35 SecurityException 12, 13 Seiten-Framework 54 Seitenvorlagen 54 Serialisierung, DataTable 63 Serialisierungsassemblies 69 SerialPort 43 SetCursorPosition() 39 Settings 49 SetWindowsPosition() 39 SetWindowsSize() 39 sgen.exe 69
94
shareTypes-Option 68 Sicherheit 7, 11, 20 Modell für Webdienste 70 Sicherheitsinstanz 11 Sicherheitsmodell 11, 12 Sicherheitsverletzung 12 zusätzliche Info 13 Sicherungskopien 20 Signierung 20 Simple Object Access Protocol 67 Skins 54 SmartPhone 2003 SE 72 Smarttags 46, 60 SMTP 38 SnapLine-Funktionalität 47 Snapshot-Isolationstransaktionen 66 Snippets 21 SOAP 67, 68 Version 1.2 68 SoundPlayer 44 Speicherverwaltung, automatische 79 Split 43 SplitContainer 43 Spracherweiterungen 23 SQL Mobile 74 Server 2005 19, 65 Express 18 Server CE 74 Server Management Studio 66 SqlBulkCopy 65 SqlCeResultSet 73 SqlClient 64 SqlCommand 62 SqlConnection 62 SqlDataReader 62 SqlDataSourceEnumerator 65 SQL-Server 2005 17
Stichwortverzeichnis
SqlServerCe 64 SslStream 35 Standard Edition (VS2005) 18 Standardnamensräume 15 starke Namen 20 statische Serialisierungsassemblies 69 StatusStrip 42 Steuerelemente 42 ASP .NET 54, 55 Ausrichten 47 AutoSize 43 CF 2.0 73 Container 43 Webpart 56 Windows Forms 2.0 41 Streamverschlüsselung 35 Strip-Designer 46 Sybase 64 Syntaxkennzeichnung 21 SystemSounds 44
T Tabellen 62 TableLayoutPanel 43 Team Editionen (VS2005) 19, 22 rollenbasierte 19 Team Foundation Server 19, 22 Templates 24 Temporäre Projekte 20 Testsuite 22 Testzertifikate 20 Themenseiten 58 Themes 54 Toolbox, Erweiterungen 42 ToolStrip 42 ToolStripContainer 43 Transaktions-Framework 65 Trust-Manager 36 TryCast 23, 32 Typauflösung 84
schnell + kompakt
Typreflektion 83 Typsicherheit 11, 76, 79
U UDDI 68 Umrisspunkte 48 Unit-Testing 22 Update 61, 63 webbasiertes 14 URL-Remapping 59 using 15, 32
V Variablenwerte im Debugger anzeigen 21 verbindungsloser Datenzugriff 62 Verbindungszeichenfolgen 65 Vererbung 79 Veröffentlichen 20 Versionsmanagement 22 verteilte Transaktionen 65 Vertrauenswürdigkeit, partielle 12 verwaltete Datenanbieter 64 Verweise, neue Alias-Eigenschaft 15 Verweistypen 83 Verzeichnisdienste für Webdienste 67 Visual Basic 2005 My 30 Operatorüberladung 32 TryCast 32 vorzeichenlose Datentypen 32 Visual Inheritance 73 Visual Studio Professional Edition 19 Standard Edition 18 Visual Studio 2005 17 Express-Editionen 18
95
Stichwortverzeichnis
Visual Studio Team System 19 Visual Web Developer 59, 60
W Web Parts 54 Web Services 2.0 67 Enhancements 17, 70 Interoperability Organization 68 web.config 59 Webanwendungen 53 webbasierte Geschäftslösungen 19 webbasiertes Update 14 Webbrowser 42 WebClient 37 Webdienste 67 deklarieren 69 Hosting 69 sichere, verschlüsselte 70 Sicherheit 70 Webdienstproxies 68 Webentwicklung 18 WebPartManager 57 Webparts 56 WebPartZone 57 WebRequest 37 WebResponse 37 Webseiten 53 Webverweis hinzufügen 68 Werttypen 83 Werttypen, nullbare 27 where-Klausel 26 Win32-API 75 Windows Forms 2.0 41 Windows Mobile 5.0 SDK 72 Windows On Windows 64 x86Emulator 11 Windows Presentation Foundation 41
96
Windows Server 2003 11 Windows XP 11 WoW64 11 WPL 41 WSDL 67, 68 wsdl.exe 68 WSE 3.0 70 WS-I Basic Profile 1.1 68 wwwroot 59
X X.509 (Webdienste) 70 x64-kompatible Prozessoren 10 x86-Prozessoren 10 XAML 41 XCopy-Deployment 13 XML 1.0 68 ADO.NET 63 binäres Format in ADO 63 CF 2.0 74 Kommentare 32 Serialisierungsassemblies, statische 69 SQL 66 XmlNode 74 XP-Stile 45 XSD 68
Y yield (Schlüsselwort) 29
Z Zeilenstatussteuerung 65 Zertifikate bei Webdiensten 70 Zertifikatsverwaltung 35, 36 Zwischenablage 31 Zwischencode-Architektur 10, 76