Diese Arbeit beschäftigt sich mit dem Microsoft .NET Framework und der objektorientierten Programmierung unter VB.NET.
Es werden beispielhaft typische Programmierstrukturen erläutert und beschrieben.
Inhaltsverzeichnis
Abkürzungsverzeichnis
1 Einleitung
1.1 Vorwort
1.2 Zielsetzung der Arbeit
1.3 Vorgehensweise
1.4 Namenskonvention
2 Theoretische und konzeptionelle Grundlagen
2.1 Begriffsdefinitionen zur Programmierung
2.1.1 Compiler
2.1.2 Konstruktor / Destruktor
2.1.3 Eigenschaft / Property
2.1.4 Methode
2.1.5 Klasse
2.1.6 Objekt
2.1.7 Namespaces / Namensräume
2.1.8 Variablen
2.2 Begriffsdefinitionen zum technischen Redesign
2.2.1 Programm
2.2.2 Engineering
2.2.3 Software-Engineering
2.2.4 Projekt
2.2.5 Softwaretest
2.3 Grundlegendes zu .NET
2.3.1 Vorteile von .NET
2.3.2 Nachteile von .NET
2.3.3 Klassifikation von Programmiersprachen
2.3.4 Anforderungen an eine moderne Programmiersprache
2.3.5 Die Sprache Visual Basic .NET
2.4 Das .NET-Framework
2.4.1 Das Schichtenmodell des Frameworks
2.4.2 Die Microsoft Intermediate Language (MSIL)
2.4.3 Die Common Language Specification (CLS)
2.4.4 Das Common Type System (CTS)
2.4.5 Die Common Language Runtime (CLR)
2.5 Entwicklungsumgebung (IDE)
2.5.1 Vorstellung der Entwicklungsumgebung
2.5.2 Ausgewählte Merkmale von Visual Studio .NET
2.6 Datenbankzugriff - Grundlagen
2.6.1 Datenzugriffsmodell - ADO.NET im Überblick
2.6.2 Das DataSet Objekt / Datenkonsument
2.6.3 Das DataTable Objekt
2.6.4 Die .NET Data Provider
2.6.5 Das DataAdapter Objekt
2.6.6 Datenbankzugriff auf eine Access-Datenbank
3 Software Engineering und praktische Umsetzung
3.1 Projektrahmen
3.1.1 Projektumfeld
3.1.2 Kundenanforderungen
3.1.3 Zielsetzung
3.1.4 Projektstrukturplan
3.2 Projektbearbeitung - Planungsphase
3.2.1 Analyse der Vor- und Nachteile der bisherigen Programmlösung
3.2.2 Ressourcen und Schnittstellen
3.2.3 Termine und Übergabezeiten
3.2.4 Lastenheft
3.3 Projektbearbeitung - Installations- und Konfigurationsphase
3.4 Projektbearbeitung - Programmierungsphase
3.4.1 Eingabevalidierung
3.4.2 Datenbanksicherung
3.4.3 Nutzung des StringBuilder Objekts für SQL-Abfragen
3.4.4 Erzeugen von Ausgabeberichten mit Crystal Reports - „Push Reports“ ...
3.4.5 Änderung von Berichtsobjekten während der Laufzeit
3.4.6 Export der Unternehmensberichte für einzelne Firmen
3.4.7 Distribution - das Setup-Projekt
3.5 Projektbearbeitung - Testphase
3.5.1 Einführung
3.5.2 Softwareprüfung
3.5.3 Testmethoden
3.5.4 Testobjekte
3.5.5 Einzeltest Auswertungsprozedur - Extremwerttest
3.5.6 Projektabweichungen
3.6 Projektübergabephase
4 Schlussbetrachtung und Ausblick
4.1 Weiterführende Arbeiten
4.2 Quellcode
Literaturverzeichnis
Erklärung
A Anhang
A.1 Programmdokumentation
A.2 Programm installieren
A.3 Programm deinstallieren
A.4 Programm starten
A.5 „SpeedPlayer“-Hauptfenster
A.6 Spiel anlegen
A.7 Spiel öffnen
A.8 Spiel vorbereiten
A.8.1 Teamdaten eingeben
A.8.2 Startberichte anzeigen
A.8.3 Berichte exportieren
A.8.4 E-Mail versenden
A.9 Spiel löschen
A.10 Spiel durchführen
A.10.1 Entscheidungen importieren
A.10.2 Entscheidungen eingeben
A.10.3 Auswertung starten
A.10.4 Neue Spielperiode wählen
A.10.5 Spielleiterberichte ausgeben
A.10.6 Spielberichte ausgeben
A.11 Sicherheitskopie der Datenbank anlegen
Tabellenverzeichnis
2-1 Vergleich von ADOalt zu ADO.NET
2-2 DataAdapter Syntax
3-1 Beteiligte Personen
Bilderverzeichnis
2-1 Das Schichtenmodell des Frameworks
2-2 Programmentwicklung - die Rolle des MSIL-Codes
2-3 Bestandteile/Dienste der CLR
2-4 Solution Explorer mit 2 Beispielprojekten
2-5 Das Solution File „DA SpeedPlayer.sln“
2-6 Das Project File „DA SpeedPlayer.vbproj“
2-7 Konfigurations-Manager für die Kompilierung
2-8 Beispielcode für einen Datenbankzugriff
3-1 Projektstrukturplan
3-2 Programmlayout „SpeedPlayer“
3-3 Beispielcode für das KeyPress Event
3-4 Beispielcode für die Existenzkontrolle einer Tabelle
3-5 Beispielcode für die Datenbanksicherung (.ini-Datei lesen)
3-6 Beispielcode für die Datenbanksicherung (.ini-Datei schreiben)
3-7 Beispielcode für das Kopieren einer Datei
3-8 Beispielcode für den Einsatz eines StringBuilders
3-9 DataSet als Datenquelle
3-10 Beispielcode für das Hinzufügen von Tabellen zum myBerichtsDataSet
3-11 XML-Schema des myBerichtsDataSets auf Festplatte schreiben
3-12 Codeauszug aus der XML-Datei DataSetInhalt.xsd
3-13 Field Explorer des Crystal Designer
3-14 Auswahl der Datenquelle im Crystal Designer
3-15 Auswahl der XML-Schema Datei im Crystal Designer
3-16 Field Explorer - Datenfelder
3-17 Codebeispiel für die Zuweisung des myBerichtsDataSets als Datenquelle zum Bericht
3-18 Codebeispiel für die Änderung von Berichtsobjekten während der Laufzeit
3-19 Importdirektive für die Crystal Reports Engine
3-20 Codebeispiel für das dynamische Laden von Bildern
3-21 Codebeispiel für das dynamische Laden von Bildern - Ermittlung der Bildobjekte
3-22 Codebeispiel für den Export der Unternehmensberichte
3-23 Codebeispiel für den Export der Unternehmensberichte - Hinzufügen von Tabellen zum myBerichtsDataSet
3-24 Visual Studio .NET Merge Module
3-25 Crystal_regwiz2003 - Property
3-26 Registrierungsfehler
3-27 Fehlerentwicklung und Fehlerbehebung
3-28 Invalid Cast Exception bei der Typkonvertierung
3-29 Codebeispiel für die Umwandlung von DBNull
Abkürzungsverzeichnis
Abbildung in dieser Leseprobe nicht enthalten
1 Einleitung
1.1 Vorwort
„Der 13. Februar 2002 markiert für Windows-Programmierer in der ganzen Welt ein wichtiges Datum. An diesem Tag wurde nach mehrjähriger Entwicklungsarbeit unter dem Namen Visual Studio .NET die neueste Version des Entwicklungswerkzeugs Visual Studio offiziell ausgeliefert (…).“1 Zum derzeitigen Stand der Arbeit hat Microsoft die PreviewVersion von Visual Studio 2005 für MSDN-Abonnenten zum Herunterladen bereitgestellt.2 Auch eine neue Version des Frameworks ist angedacht.
Die vorliegende Arbeit befasst sich mit der Neuentwicklung und Migration des Unter- nehmensplanspiels „BiZ-Player“3 der Georg-Simon-Ohm-Fachhochschule in eine .NETUmgebung. Hinter .NET versteckt sich eine völlig neue Systemarchitektur, die innerhalb mehrerer Jahre von der Firma Microsoft entwickelt wurde und Sprachen- sowie Plattformunabhängigkeit propagiert. Zukünftige Windows-Versionen werden von Anfang an mit dieser Systemplattform ausgestattet sein und immer mehr Anwendungen werden auf ihr aufbauen.4 Als Programmiersprache für die Portierung des Planspiels wurde Visual Basic .NET gewählt, welches der Nachfolger von Visual Basic 6.0 ist. Wie viele andere .NETProgrammiersprachen auch, arbeitet es völlig objektorientiert.5
Grundlage dieser Arbeit ist die „BiZ-Player“6 -Microsoft-Access-Datenbank, welche bisher als Basis des Planspiels für die Eingabe, Visualisierung und Berechnung von betriebswirtschaftlichen Daten an der Hochschule genutzt wird.
Mit Hilfe des Unternehmensplanspiels soll es den Studenten des Fachbereichs Betriebs- wirtschaft möglich sein, erste Erfahrungen im Team bei der Führung und Leitung eines eigenen Unternehmens zu sammeln. Das Planspiel stellt dazu in der Datenbank ver- schiedene Spielszenarien zur Auswahl, welche die Branchenstruktur und das Produktan- gebot am Markt sowie die materielle und finanzielle Situation der teilnehmenden Unter- nehmen definieren. Alle teilnehmenden Firmen befinden sich dabei in völliger Konkurrenz zueinander und unterliegen den Wettbewerbs- und Absatzmechanismen des betreffenden Marktes. Motivation der einzelnen Marktteilnehmer ist die Maximierung des Shareholder- values für die Anteilseigner des Unternehmens und das Streben nach Gewinn. Um diese Ziele zu erreichen, haben die Teams die Möglichkeit, sich auf eine geeignete Strategie zu verständigen und mittels Entscheidungen im Rahmen von vorgegebenen Entscheidungs- bereichen die Möglichkeit, diese am Markt durchzusetzen. Sieger des Planspiels ist das Unternehmen, welches nach allen Spielrunden den höchsten Gesamtgewinn ausweisen kann, wobei die Zahl der Perioden und der Zeitpunkt für die Entscheidungen vom Spiellei- ter vorgegeben sind. Zentrales Element des Spiels sind die Unternehmensberichte, die nach jeder abgeschlossenen Entscheidungsperiode vom Spielleiter generiert und an die teilnehmenden Teams versandt werden. Die Bereichte geben Aufschluss über die aktuelle Lage des Unternehmens und die Auswirkungen der getroffenen Entscheidungen. Aus Sicht der Spielteilnehmer bilden die Unternehmensberichte die zentrale Basis für ihre Ent- scheidungsfindung.7
1.2 Zielsetzung der Arbeit
Ziel dieser Diplomarbeit soll es sein, mit Hilfe der Programmiersprache Visual Basic .NET und der Entwicklungsumgebung Visual Studio .NET ein eigenständig lauffähiges Pro- gramm zu entwickeln, welches auf Grundlage der „BiZ-Player“-Datenbank das Unterneh- mensplanspiel abbildet. Dem Spielleiter soll es dadurch möglich sein, auf einfache Art und Weise relevante Unternehmensentscheidungen in die Datenbank einzugeben bzw. zu importieren und die notwendigen Kalkulationen und Buchungen durchzuführen. Im Mittel- punkt der Arbeit steht dabei der Zugriff auf die Datenbank mittels ADO.NET unter Ver- wendung aller relevanten .NET Data Provider sowie ADO-Objekte. Die Visualisierung der gewonnen Daten soll in Form von ausdruckbaren Berichten erfolgen.
1.3 Vorgehensweise
Um Hintergründe sowie insbesondere einzelne Programmbausteine und Vorgehenswei- sen innerhalb dieser Arbeit besser verstehen zu können, widmet sich das zweite Kapitel theoretische Grundlagen. Neben fundamentalen Begriffsdefinitionen aus dem Software- Engineering und der Programmierung wird hier auf die .NET-Technologie und insbeson- dere auf den Aufbau des Frameworks näher eingegangen. Es wird ferner die der Arbeit zugrunde liegende Entwicklungsumgebung Visual Studio .NET kurz anhand ausgesuchter Merkmale charakterisiert.
Im Anschluss daran werden die Datenbankschnittstelle ADO.NET und deren wichtigste Klassen und Objekte sowie die einzelnen Daten-Provider näher vorgestellt. Den Ab- schluss des zweiten Kapitels bildet eine beispielhafte Darstellung für einen Zugriff auf eine Microsoft Access-Datenbank unter Verwendung der zuvor angesprochenen Objekte anhand eines Codelistings.
Die eigentliche Umsetzung und Entwicklung des Programms „SpeedPlayer“ wird im dritten Kapitel behandelt. Hier werden im Rahmen einer projektorientierten Vorgehensweise die einzelnen Entwicklungsphasen und deren Ergebnisse näher erläutert und beschrieben. Eine zentrale Rolle spielen dabei die während der Entwicklung aufgetretenen Probleme. Anhand von ausgesuchten Codebeispielen wird deren Lösung beschrieben. Den Abschluss findet das dritte Kapitel mit der Vorstellung verschiedenster Testmethoden, welche in der Praxis eingesetzt werden, um im Zuge der Qualitätssicherung von Software diese noch produktiver zu gestalten.
Das vierte Kapitel fasst die gewonnen Erkenntnisse der Arbeit noch einmal zusammen und gibt einen Ausblick über zukünftige Entwicklungen. Ferner werden hier noch einige Vorschläge für mögliche weiterführende Entwicklungsarbeiten am Programm „SpeedPlayer“ aufgezeigt.
1.4 Namenskonvention
In der vorliegenden Arbeit wird folgende Namensgebung verwendet:
-Alle Bezüge zur bestehenden Datenbanklösung sind mit „BiZ“ bezeichnet.
-Alle Bezüge zum technischen Redesign des vorliegenden Programms und seiner Module sind mit „SpeedPlayer“ bezeichnet.
-„ADOalt“ bezeichnet die in Visual Basic 6 genutzten ActiveX Data Objects.
2 Theoretische und konzeptionelle Grundlagen
2.1 Begriffsdefinitionen zur Programmierung
2.1.1 Compiler
Compiler sind Übersetzungsprogramme, die das Quellprogramm in eine für Maschinen verständliche Sprache übersetzen (kompilieren) sollen.8
2.1.2 Konstruktor / Destruktor
Ein Konstruktor wird über das NEW -Schlüsselwort aufgerufen, sobald eine neue Instanz der Klasse angelegt wird. Konstruktoren haben die Aufgabe, Objekte direkt bei ihrer Instanziierung zu initialisieren, das heißt, mit Startvariablenwerten zu versehen. Es können in einer Klasse mehrere (überladene) Konstruktoren koexistieren, welche über unterschiedliche Parameterlisten angesprochen werden können.
Destruktoren werden dann aufgerufen, wenn keine Referenz mehr auf das Objekt zeigt. Der Speicher wird dann durch Aufruf spezieller Methoden wieder freigegeben, zum Beispiel der Dispose Methode.9
2.1.3 Eigenschaft / Property
Unter Eigenschaften versteht man bestimmte Attribute, die Objekte besitzen können, z. B. die Höhe oder Breite eines Fensters oder die Farbe des Fensterhintergrundes. Dabei ver- fügen unterschiedliche Objekte über unterschiedliche Eigenschaften.10 Das Verändern von Eigenschaften wird sehr häufig über GET- bzw. SET-Prozeduren vollzogen. Mit GET wird der Wert einer Eigenschaft ausgelesen und mit SET kann ein neuer Eigenschaftswert festgelegt werden. Durch diese Vorgehensweise kann eine Wertvalidierung innerhalb der Property implementiert werden.11
2.1.4 Methode
Unter Methoden versteht man bestimmte Prozeduren bzw. Funktionen, die ein Objekt besitzen kann. Methoden können die Attribute des Objekts verändern und somit das Verhalten des Objekts beeinflussen. So hat zum Beispiel die Klasse CAuto ein Objekt Auto mit der Eigenschaft Geschwindigkeit und der Methode Beschleunigen.
2.1.5 Klasse
Klassen enthalten Anweisungen, wie nach deren Bauplan Objekte im Speicher generiert werden sollen. Sie lassen sich mit den folgenden Eigenschaften charakterisieren:
-Klassen beschreiben Objekte. Sie könnten dabei mehrmals verwendet werden, um Objekte desselben Typs zu erstellen.
-Klassen entstehen durch Initialisierung, d. h., indem alle ihre Eigenschaften/Attri- bute mit einem Anfangswert versehen werden. Dies geschieht durch einen Kon- struktor.
-Klassen können Eigenschaften/Attribute und Methoden bzw. Funktionen besitzen, die für andere Objekte sowohl sichtbar als auch unsichtbar sein können.12 Man spricht hier von einem public field bzw. von einer gekapselten private Property. Durch die Kapselung soll sichergestellt werden, dass nur innerhalb der Klasse auf die Daten zugegriffen werden kann.
-Klassen besitzen die Möglichkeit, bestimmte Eigenschaften mit denen anderer Klassen zu teilen.
-Klassen können vererbt werden, d. h., andere Klassen erben bestimmte Eigen- schaften der Basisklasse und erweitern ihre eigene Klasse um zusätzliche Attribute (Polymorphismus).13
-Jede Klasse besitzt einen Konstruktor, zum Beispiel den parameterlosen Stan- dard-Konstruktor NEW().
2.1.6 Objekt
Werden die Anweisungen umgesetzt, die in einer Klasse stehen, so gelangt man zu ei- nem Objekt. Objekte bestehen aus bestimmten Eigenschaften (statisch) und aus Metho- den (dynamisch), mit denen man die Eigenschaften bearbeiten kann. Objekte sind die Umsetzung des Bauplanes einer bestimmten Klasse, auf die sie sich beziehen.14 Hinter- grund der objektorientierten Programmierung ist es, reale Objekte in elektronischer Form mit ihren wesentlichen Eigenschaften und Funktionen nachbilden zu können.15
2.1.7 Namespaces / Namensräume
Namensräume sind eine grundlegende Art und Weise, Klassen zu organisieren. Sie ha- ben die Aufgabe, Namens- bzw. Bezeichnungskonflikte zu vermeiden. So sind zum Bei- spiel die gesamten Basisklassen des Frameworks in logische Namensräume und Anwen- dungsgebiete eingeordnet.16 Damit eine explizite Referenzierung einzelner Objekte entfal- len kann, werden die Namespaces über die Importanweisung zu Beginn der Klasse be- kannt gemacht.
2.1.8 Variablen
Variablen dienen zum Zwischenspeichern von Werten, welche während der Programmlaufzeit entstehen. Die Speicherung der Werte erfolgt dabei in definierten Speicherzellen im Hauptspeicher des Computers. Jede Variable besteht aus vier Merkmalen:17
-Name
-Datentyp
-Gültigkeitsbereich
-Lebensdauer
2.2 Begriffsdefinitionen zum technischen Redesign
2.2.1 Programm
Ein Programm dient zur Lösung einer oder mehrerer Aufgaben und stellt ein System von Arbeitsanweisungen an einen Rechner dar, welche mit Hilfe einer Programmiersprache umgesetzt werden können. Synonym sind Begriffe wie Software bzw. Softwaresystem. Je nach Aufgabe gibt es eine Vielzahl an Programmarten zu unterscheiden, die alle einer Reihe von allgemeinen Anforderungen genügen müssen:18
-Benutzerfreundlichkeit
-Korrektheit
-Zuverlässigkeit
-Erweiterbarkeit
Das sind nur einige Beispiele dafür.
2.2.2 Engineering
Unter Engineering versteht man eine zielorientierte Verwendung von Prinzipien bzw. Verfahren, welche eine arbeitsteilige Programmerstellung gewährleisten sollen. Folgende Merkmale sind dabei kennzeichnend:
-Vorgegebenes und zielgerichtetes Vorgehen
-Verwendung von bestimmten Konstruktionsprinzipien
-Einsatz bewährter Verfahren
-Unterstützung durch den Einsatz maschineller Werkzeuge19
2.2.3 Software-Engineering
Der Begriff Software-Engineering wurde erstmals innerhalb einer Arbeitsgruppe in den sechziger Jahren geprägt. Seine Bedeutung bestand darin, die unter Engineering genann- ten Verfahren und Methodiken anzuwenden, um eine Softwareentwicklung auf professio- neller Basis mit verbindlichen Abmachungen zwischen Enduser und Entwickler zu ge- währleisten.20 Nach einer Definition von Pomberger und Blaschek versteht man darunter die praktische Anwendung wissenschaftlicher Erkenntnisse für eine wirtschaftliche Programmierung hochwertiger Software.21 Ziele des Software-Engineerings sind im Speziellen die Einhaltung von Terminen und die Reduktion von Entwicklungs- und Wartungskosten für die zu entwickelnde Software.
2.2.4 Projekt
Projekte sind Vorhaben, die im Wesentlichen durch folgende Charakteristika bestimmt sind:22
-Einmaligkeit der Bedingungen
-Zielvorgabe
-Zeitliche Begrenzungen, zum Beispiel in Form von Start- und Endterminen
-Abgrenzung gegenüber anderen Vorhaben
-Projektspezifische Organisationsstruktur
-Ergebnisrelevanz
-Neuartigkeit der Aufgabe (Know-how)
-Risiken, wie zum Beispiel Planungs- oder Organisationsfehler
2.2.5 Softwaretest
Unter Testen versteht man das Vergleichen der funktionellen Eigenschaften einer Software gegen eine definierte Vorgabe.23
2.3 Grundlegendes zu .NET
Mit der Entwicklung von „.NET“24 hat Microsoft einen weiteren Meilenstein geschaffen, um Computersysteme global zu vernetzen und dadurch eine bessere Zusammenarbeit zwischen Anwendern zu gewährleisten. Microsoft hat mit seiner Strategie frühzeitig erkannt, dass Software in naher Zukunft nicht mehr über herkömmliche Distributionskanäle, wie zum Beispiel über CDs vertrieben wird, sondern in Form von Webdiensten, welche über das Internet bereitgestellt werden.25
Die .NET-Technologie ist keine neue Erfindung der Firma Microsoft, sondern vielmehr als eine Art Gesamtkonzept anzusehen. Dieses Konzept betrachtet bereits bestehende Technologien nicht mehr für sich allein, sondern integriert sie und lässt sie miteinander verschmelzen. Ziel soll es sein, vorhandene „Insellösungen“ durch ein offenes, plattformübergreifendes System mit einheitlichen Protokoll-Standards wie SOAP, basierend auf HTML und XML, zu ersetzen.26
Wenn man sich näher mit .NET beschäftigt, stellt man fest, dass es viele Parallelen, aber auch Unterschiede zur Programmiersprache JAVA gibt.27 Mit der Einführung von JAVA entstand ein Umdenken in der Software-Entwicklungsgemeinde, welche nicht spurlos an Microsoft vorbeigegangen ist. Die Art und Weise, wie ab diesem Zeitpunkt Programmierer Dinge sahen, führte zu einem grundlegenden Paradigmenwechsel. Dieser bestand darin, dass mit Kenntnis der Fakten und Details über JAVA die etablierten Konzepte von Micro- soft aufgegriffen, erweitert und dahingehend verändert bzw. verbessert wurden, dass
Schwachstellen eliminiert werden konnten.28 Das Ergebnis war eine komplett neue Entwicklungsumgebung, welche keine bloße Zusammenstellung von bisherigen Technologien war. Der Hauptunterschied zwischen .NET und JAVA im engeren Sinne liegt im Zielverständnis beider Technologien. So versucht man beispielsweise durch .NET, im Gegensatz zu JAVA, viele Sprachen auf einer Plattform zu unterstützen.29
.NET selbst ist modular aufgebaut und fügt sich aus zahlreichen Teilkomponenten zusammen, die hier kurz vorgestellt werden sollen:
-.NET-Plattform
Sie stellt ein einheitliches Programmiermodell in Form einer plattformübergreifenden Basis zur Verfügung.
-Microsoft .NET-Dienste
unter anderem: MSN.NET, Office.NET, Messaging oder Authentisierung im Inter- net
-.NET-Dienste anderer Hersteller
Im Zuge der Globalisierung sollen Firmen von nun an über die gemeinsame .NET- Schnittstelle kooperieren und kommunizieren können.
-.NET myServices
ist eine Ansammlung von diversen Internet-Diensten und Dienstleistungen, die Enduser sowie Firmen von Microsoft über eine gemeinsame Schnittstelle beziehen können. Kerngedanke dabei ist die Verfügbarkeit von Informationen, zu jeder Zeit, an jedem Ort und von jedem Gerät aus.
-.NET Passport
versteht sich als Voraussetzung für die Nutzung einiger Dienste und erlaubt ein zentral verwaltetes Login.
Damit ist es möglich, sich schnell und einfach in Webseiten zu authentifizieren, ohne dass der Anwender alle Passwörter im Kopf behalten muss. Klassisches Anwendungsgebiet ist hierbei die Online-Bezahlung von Gütern.30 31
2.3.1 Vorteile von .NET
„.NET wurde notwendig, weil sich die Anforderungen an die moderne Softwareentwick- lung in den letzten Jahren drastisch verändert haben.“32 Das folgt nicht zuletzt auch aus Microsofts Befürchtungen, JAVA könnte eine Vormachtstellung einnehmen. Vor der Einführung von .NET wurden komplexere Programme fast ausschließlich in C bzw. C++ entwickelt. Für eine Interoperabilität bzw. Abwärtskompatibilität der verwende- ten Komponenten sorgte Microsoft durch die Entwicklung und Einführung von COM (Component Object Model) bzw. COM+. Dadurch konnte man auf die Funktionalität von Elementen zurückgreifen und sie in Anwendungen implementieren und nutzen, unabhän- gig von der Sprache, in der sie ursprünglich geschrieben wurden.33 Diese Technologie brachte jedoch zahlreiche Probleme mit sich, die durch eine neue Infrastruktur behoben werden mussten. Ein Beispiel dafür ist die so genannte „DLL-Hell“, bei der die COM- Bibliotheken bei einer Neuinstallation eines Programms in das Systemverzeichnis von Windows kopiert wurden und unter Umständen aufgrund von Inkompatibilitäten zu Konflik- ten führten, da es bis dahin noch keinen Versionsschutz gab.34 Eine Lösung dieses Prob- lems bringt die „Side by Side“-Ausführung (Versionierung) von Komponenten und Anwen- dungen unter .NET. Das bedeutet verschiedene Versionen ein und derselben Komponente können von nun an parallel ausgeführt werden.35
Für die .NET-Systemplattform sprechen aber noch zahlreiche weitere Gründe:
-Die entwickelten Programme können problemlos weitergegeben werden. Damit fällt eine mühsame Registrierungsroutine in der Windows-Registrierdatenbank komplett weg. Fertige Anwendungen können z. B. durch Kopieren ausgeliefert werden. Einzige Voraussetzung für das Funktionieren des Programms ist das In- stallieren des .NET-Frameworks auf dem Zielrechner.36 Dies ist zumindest für einfach strukturierte Programme gültig. Auf die problemlose Weitergabe der Programme wird im Verlaufe der Arbeit noch einmal gesondert eingegangen.
-Die entwickelte Software ist von nun an theoretisch auf unterschiedlichen Plattfor- men lauffähig. Es gibt bereits erste Versuche, eine open Source-Version der .NET- Plattform für LINUX/UNIX-Systeme zu entwickeln.37 Die Software läuft zum Bei- spiel auch auf mobilen Endgeräten wie PDAs.38 Auch hier existiert wieder eine sehr starke Parallele zu JAVA’s Virtual Machine, welche sich ebenfalls problemlos auf andere Plattformen portieren lässt. Es besteht somit keine Notwendigkeit mehr, sich näher mit den entsprechenden Compilern zu befassen bzw. sich Ge- danken zu machen, welche spezifischen Hardwarevoraussetzungen das Zielsys- tem erfüllen muss. Einzige Voraussetzung ist „nur“ noch das Vorhandensein der Laufzeitumgebung.
-Ein weiterer großer Vorteil ist die Sprachunabhängigkeit39, d. h., Programme kön- nen in einer beliebigen .NET-Sprache, zum Beispiel C# oder J#40, erstellt werden und verwenden dabei untereinander die gleichen Datentypen und Bibliotheken (Vereinheitlichung). Im Speziellen bedeutet dies, dass z. B. eine in C# erstellte Klasse von jeder .NET konformen Sprache aus aufgerufen und verwendet werden kann und umgekehrt. Die charakteristischen Merkmale einer Sprache verwischen und gehen somit fließend ineinander über.41 Diese Tatsache führt nicht zuletzt zu einer erheblichen Einsparung an Entwicklungskosten für Software. Derzeit setzen ca. 20 Sprachen auf .NET-Technologie auf.
-Der Garbage Collector, auch „Müllsammler“ genannt, kommt immer dann zum Einsatz, wenn das Programm nicht stark ausgelastet ist. Er übernimmt die Aufgabe, auf intelligente Art und Weise den Speicher periodisch nach nicht mehr verwendeten Objekten zu durchforsten, deren Lebensdauer zu überprüfen und diese ggf. aus dem Speicher zu entfernen.42
-.NET ist vollkommen objektorientiert, das heißt, alle Elemente lassen sich auf Ob- jekte zurückführen und sind vom Typ SYSTEM.OBJECT abgeleitet. Dies gilt auch im Speziellen für einfache Datentypen, wie z. B. den INTEGER. Sie können somit über den Referenztyp OBJECT aufgerufen werden (Boxing-Verfahren).43
2.3.2 Nachteile von .NET
Die .NET-Technologie bringt jedoch nicht nur Vorteile mit sich, sondern auch einige nennenswerte Nachteile:
-Bestehende VB 6.0 Projekte können nicht ohne weiteres bzw. nur mit sehr großem Aufwand in VB.NET portiert werden. Visual Studio bietet dazu einen Migrations- assistenten an, welcher jedoch nur für kleinere, wenig komplexe Projekte geeignet ist. Eine Portierung ist daher immer mit Kosten und Zeitaufwand sowie Know-how verbunden.
-.NET-Programme benötigen ein installiertes Framework, welches ca. 20 MB groß ist und unter Umständen erst herunter geladen bzw. in Setup-Projekte mit eingebunden werden muss.
-.NET-Programme laufen nicht mehr auf Rechnern mit Betriebssystemen unter Windows 98 und können nicht auf Rechnern mit Windows 98 entwickelt werden. Dies ist für Firmen, welche nicht auf die .NET-Technologie verzichten können, mit erheblichen Mehrkosten verbunden.
-Eine vollständige Entwicklungsumgebung (Visual Studio) einschließlich der benö- tigten Serverprogramme und der Source Control Programme, zum Beispiel Visual Source Safe, sind teuer in der Anschaffung und somit für kleinere Firmen oft nicht erschwinglich.44
-Das Programmieren unter .NET braucht eine lange Einarbeitungszeit, je nach Kenntnisstand und Erfahrungen in der objektorientierten Programmierung.45
2.3.3 Klassifikation von Programmiersprachen
Eine Programmiersprache ist eine künstlich geschaffene Sprache mit festgelegter Syntax. Sie hat die Aufgabe, Arbeitsanweisungen für eine ganz bestimmte Problemstellung in einem Programm zusammenzufassen und dieses anschließend in Maschinensprache umzuwandeln.46
Dabei gibt es unterschiedliche Möglichkeiten, Programmiersprachen einzuordnen. In der Vergangenheit wurden Sprachen oft in Generationen eingeteilt. Folgende Stadien sind dabei zu unterscheiden:
1. Maschinensprachen
2. Assembler
3. Höhere Programmiersprachen/High Level Languages, welche weitestgehend un- abhängig sind von der zugrunde liegenden Plattform und dem Prozessortyp
4. Fourth Generation Language (4GL)
5. Very High Level Language (VHLL)
Heutzutage ist man von dieser Einteilung abgerückt und klassifiziert die Sprache nach den zugrunde liegenden Konzepten bzw. nach der zugrunde liegenden Logik:
-nach Maschinennähe, d. h. alle Sprachen, deren Befehlsvorrat den wesentlichen Instruktionen des Prozessors entsprechen.47
-nach Problembezogenheit, zum Beispiel spezielle Sprachen für die System- programmierung wie C oder C++
-Nach Paradigmenbezogenheit, zum Beispiel alle objektorientierten Sprachen mit typischen Eigenschaften wie Datenkapselung oder Polymorphismus. Bei objekt- orientierten Sprachen liegt der Schwerpunkt auf der Strukturierung des Pro- gramms in einzelne Objekte.48
2.3.4 Anforderungen an eine moderne Programmiersprache
Für welche Programmiersprache sich der Entwickler letztlich entscheidet, richtet sich nach persönlichen Präferenzen und Anforderungen an das Programm. Im Folgenden sollen einige Kriterien dafür genannt sein:
-Leichte Erlernbarkeit, zum Beispiel durch das Verwenden von Sprachkonstrukten, die denen von natürlichen Sprachen ähnlich sind
-Geschwindigkeit, die programmierten Anwendungen müssen schnell performant sein
-Plattformunabhängigkeit, d. h., die erstellten Programme sollen auf mehreren Sys- temen lauffähig sein
-Problemlösegeschwindigkeit, d. h., wie schnell kann ein Entwickler ein ihm gege- benes Problem in der Sprache umsetzen
-Fehleranfälligkeit, d. h., wie komplex ist die Sprache aufgebaut, müssen bei- spielsweise Zeilenende-Zeichen gesetzt werden, usw.
-Welche Sprachkonstrukte hat die Sprache bereits implementiert?49
2.3.5 Die Sprache Visual Basic .NET
VB.NET ist neben Java, Delphi, Perl, C oder C# nur eine unter vielen Programmiersprachen und ist der direkte Nachfolger von VB 6.0. Die Sprache ist objektorientiert und ereignisgesteuert aufgebaut. Das heißt, dass eine damit entwickelte Anwendung über be- stimmte Benutzereingaben steuerbar ist.
Gegenüber älteren VB-Versionen bringt Visual Basic .NET entscheidende Änderungen mit sich:
-Die Sprache arbeitet jetzt völlig objektorientiert.
-Der Focus liegt sehr stark auf verteilten Anwendungen, wie sie zum Beispiel durch das Internet ermöglicht werden.
-Die Sprache realisiert vereinfachte Deklaration von Variablen und Wertzuweisung sowie neue Datentypen und Änderungen bei den Zuweisungsoperatoren.50
-Es besteht keine hundertprozentige Sourcecodekompatibilität zu VB 6.0 mehr.
-Das noch unter VB 6.0 genutzte COM-Modell rückt immer mehr in den Hinter- grund.
-Es gibt nun eine einheitliche Entwicklungsumgebung für alle .NET-Sprachen.
2.4 Das .NET-Framework
Wichtigster Bestandteil innerhalb der .NET-Plattform ist das Framework, welches eine Art Grundgerüst bzw. eine Klassenbibliothek für die Anwendungsentwicklung darstellt. Das .NET-Framework ist seit Anfang 2002 in der finalen Version verfügbar und durch Hewlett- Packard, IBM, Sun und andere Firmen bei der European Computer Manufacturers Asso- ciation standardisiert. Es ist dabei ähnlich anzusehen wie die virtuelle Maschine (JVM), die man von der JAVA-Programmierung her kennt.51 Grundsätzlich versteht man unter einem Framework ein „Rahmenwerk“, welches bereits viele Standardkomponenten bein- haltet und diese Softwareentwicklern zur Verfügung stellt. Um die Plattformunabhängig- keit zu gewährleisten, sind viele Bestandteile deshalb standardisiert und international an- erkannt, wie zum Beispiel HTML oder XML. Die Benutzung eines solchen Frameworks macht durchaus Sinn, da sie zu einer erheblichen Effizienzsteigerung bei der Program- mierung führt, indem bereits einmal entwickelte Systemteile wieder verwendet werden können.52 Das .NET-Framework gliedert sich in zahlreiche Einzelbestandteile und stellt die Kernfunktionalität der .NET-Technologie zur Verfügung.53 Es handelt sich bei dieser Infrastruktur gleichermaßen um eine Entwurfs- wie Laufzeitumgebung, in der WindowsAnwendungen erstellt und verteilt werden können.54 Es muss allerdings darauf geachtet werden, dass diese auf allen Rechnern installiert ist, auf denen die entwickelten Pro- gramme später lauffähig sein sollen, d. h., der für die Plattform erforderliche Compiler muss vorhanden sein. Dazu können die Installations-Routinen des Frameworks kostenlos aus folgender Quelle heruntergeladen werden:
http://www.msdn.microsoft.com/netframework/
Für die Anwendungsentwicklung empfiehlt es sich, das .NET-Framework SDK zu installieren, welches das „herkömmliche“ Framework um verschiedene Entwicklungstools (z. B. Command-line tools, Administrationstools, Compiler) erweitert bzw. ergänzt.
2.4.1 Das Schichtenmodell des Frameworks
Wie schon angesprochen, kann das .NET-Framework als Schichtenmodell betrachtet werden, da es sich aus mehreren Ebenen/Layern zusammensetzt (siehe Bild 2-1). Im Folgenden sollen zentrale Bestandteile herausgegriffen und näher erläutert werden.
Abbildung in dieser Leseprobe nicht enthalten
Bild 2-1 Das Schichtenmodell des Frameworks55
2.4.2 Die Microsoft Intermediate Language (MSIL)
Die Entwicklung eines VB-Programms vom Quellcode bis zur ausführbaren Datei lässt sich grundsätzlich in zwei eigenständige Prozesse gliedern, den
-Prozess der Programmentwicklung, auch design time bzw. Entwurfszeit genannt. Hier versucht der Programmierer innerhalb der Entwicklungsumgebung die Anfor- derungen bzw. ein ihm gegebenes Problem mit Hilfe der Programmiersprache umzusetzen.
-Prozess des Programmablaufs, auch runtime bzw. Laufzeit genannt. In dieser Phase wird der Code weiterverarbeitet und in eine für die Maschine lesbare Form gebracht.
Gemeinsame Schnittstelle beider Prozesse ist die Microsoft Intermediate Language (MSIL, Sprachabstraktionsebene), welche eine Art Zwischencode ist, der vom .NET- Compiler erzeugt wird, z B in Form von .exe- bzw. .dll-Dateien. Dieser MSIL-Code ist plattform- und hardwareunabhängig. Damit ist es egal, ob eine Komponente in VB.NET oder in C# geschrieben wurde, der Quellcode wird immer zuerst in ein und dieselbe IL kompiliert.56 Die so erzeugte .exe- bzw. .dll-Datei enthält Instruktionen und Anweisungen, die von der Runtime gelesen werden können. Erst zur Laufzeit des Programms wird der IL-Code57 durch einen weiteren Compiler, den so genannten JITter, in Maschinensprache übersetzt.58 Es finden also, abstrakt betrachtet, zwei Kompilierungsprozesse statt.
Abbildung in dieser Leseprobe nicht enthalten
Bild 2-2 Programmentwicklung - die Rolle des MSIL-Codes59
Der vom .NET-Compiler generierte MSIL-Übergangscode ist nicht als sicher bzw. als ge- schützt einzustufen. Dem Systementwickler gibt Microsoft ein Tool mit dem Namen „ildasm.exe“ an die Hand, mit dem es möglich ist, den MSIL zu lesen und zu analysieren oder gar in das ursprüngliche Programm zurück zu verwandeln.60 „ildasm“ steht für Inter- mediate Language Disassembler, die Datei liegt im .\BIN-Verzeichnis des SDK. Aus ei- nem vorliegenden Übergangscode könnte damit wieder neuer Quellcode höherer Spra- che, z. B. C#, produziert werden.61 Obgleich Microsoft diesen Umstand durch das Imple- mentieren eines so genannten „obfuscators“ erschwert bzw. verhindert, gibt es doch brauchbare Tools im Netz, die zu vernünftigen Ergebnissen führen (z. B. das Tool Sala- mander auf http://www.remotesoft.com). Obfuscatoren versuchen mit kryptischen Erset- zungen von Methoden und Variablen dem Disassembler-Nutzer die Reproduktion von Quellcode möglichst zu erschweren.62
2.4.3 Die Common Language Specification (CLS)
Um den oben beschriebenen MSIL Code überhaupt erzeugen zu können, werden gewis- se Standards und Regeln für alle auf dem .NET-Framework aufsetzende Sprachen benö- tigt. „Diese werden durch die CLS definiert, die eine Reihe von Eigenschaften festlegt, die jede .NET-Programmiersprache erfüllen muss.“63 Ein erzeugter Programmcode, welcher zu den Spezifikationen konform ist, ist somit garantiert lauffähig, egal in welcher Sprache die Anwendung ursprünglich programmiert wurde. Die CLS stellt somit eine wesentliche Voraussetzung für die Interoperabilität der erstellten Prozeduren und die Softwareentwick- lung im Team dar.64
2.4.4 Das Common Type System (CTS)
Das CTS ist ein Kernbestandteil der CLS, welcher alle Datentypen festlegt und be- schreibt, die von der .NET-Laufzeitumgebung unterstützt werden sollen. Das bedeutet, dass die hier definierten Datentypen in allen .NET konformen Sprachen einheitlich sein müssen, um eventuelle Probleme beim Zugriff auf sprachfremde Komponenten zu vermeiden.65 Dies ist ein weiteres wichtiges Merkmal für die Interoperabilität der Sprache. Dabei lassen sich Datentypen grundsätzlich in zwei wesentliche Gruppen gliedern, zum einen in tatsächliche Werttypen (z. B. INTEGER) und zum anderen in die sogenannten Referenztypen (z. B. Typ OBJECT).66
2.4.5 Die Common Language Runtime (CLR)
Unter der Common Language Runtime versteht man die Laufzeitumgebung des .NET- Frameworks, welche auf dem Zielrechnersystem installiert sein muss, damit alle .NET konformen Programme von dort gestartet werden können. Sie ist zentraler Bestandteil des Frameworks und zuständig für die ordnungsgemäße Ausführung der Applikation, zum Beispiel durch Analysieren des MSIL Codes hinsichtlich eventueller Konflikte. Man spricht in diesem Zusammenhang von so genanntem „managed code“ (verwalteter Code), da die CLR für alle Objekte die Verwaltung bzw. die Re-Allokation des Speichers übernimmt.67 Charakteristische Eigenschaft des verwalteten Codes ist, dass er stabil und sicher inner- halb der Laufzeitumgebung ausgeführt werden kann und somit absturzsicher ist.68 Im Un- terschied dazu wird der so genannte „unmanaged code“ (unverwalteter Code) für Pro- gramme benötigt, die direkt auf die Hardwareressourcen eines PCs zugreifen, z. B. Treiberprogramme.
Hauptbestandteil der CLR ist der JIT Compiler, der für das Kompilieren des Codes in sys- temeigene Sprache (Maschinencode) der jeweiligen Plattform zuständig ist. Dabei wird jedoch niemals der komplette Zwischencode kompiliert, sondern lediglich die Modulfrag- mente, welche unmittelbar für die Ausführung des Programms auf der Zielplattform benö- tigt werden.69
Abbildung in dieser Leseprobe nicht enthalten
Bild 2-3 Bestandteile/Dienste der CLR70
2.5 Entwicklungsumgebung (IDE)
2.5.1 Vorstellung der Entwicklungsumgebung
Um mit Visual Basic .NET programmieren zu können, ist eine Entwicklungsumgebung nicht zwingend erforderlich. Oft ist ein einfacher Texteditor, z. B. Notepad und das .NET- Framework SDK, für das Erstellen elementarer Programme weitgehend ausreichend.71 Es bietet sich jedoch an, für komplexere Aufgabenstellungen (z. B. Programme mit einer gra- fischen Benutzerschnittstelle (GUI), die IDE Visual Studio .NET zu verwenden. (Eine Al- ternative zu VS.NET stellt das Open Source Projekt „Sharp Develop“ dar, das unter URL http://www.icsharpcode.net/OpenSource/SD/default.asp zum Download angeboten wird.) Microsoft stellt damit dem Anwender ein Werkzeug zur Verfügung, welches auf der .NET- Technologie aufsetzt und in dem alle notwendigen Tools bereits integriert sind, wie visuel- ler Oberflächenentwurf, Debugger für die Fehlersuche und vieles mehr. So werden zum Beispiel gleich mehrere Programmiersprachen mit unterstützt (z. B. VB, C#, C++, J#).
Je nach Anspruchsniveau sind folgende Versionen der IDE verfügbar:72
-Enterprise Architect (VSEA)
-Enterprise Developer (VSED)
-Professional
-Standard
Die einzelnen Komplettpakete unterscheiden sich hinsichtlich ihres Funktionsumfangs darin, welche Zusatzprodukte von Hause aus mit integriert sind, wie zum Beispiel der Microsoft SQL-Server.
Visual Studio .NET kann auf folgenden Betriebssystemen installiert werden:
-Windows 2000 Server bzw. Professional
-Windows XP Home bzw. Professional
-Windows NT4 Server73
Beim ersten Starten der IDE hat der Anwender die Möglichkeit, ein Benutzerprofil zu sei- ner bevorzugten Programmiersprache generieren zu lassen. Je nach getroffener Auswahl passt die IDE dann selbstständig Hilfe, Keyboard-Layout und Toolfenster an. Im späteren Betrieb gelangt der Anwender zunächst auf die Einstiegsseite von Visual Studio .NET und hat von da aus die Möglichkeit, seine Projekte zu verwalten oder Informationen zu sammeln, z. B. von einschlägigen Newsgroups, der Microsoft Knowledgebase oder von anderen Download-Seiten.74 Die Programmierumgebung bietet dem Anwender also folgende Vorteile gegenüber einer herkömmlichen Texteditorlösung:
-Einheitliche Entwicklungsumgebung für alle .NET-Sprachen, z. B. ASP.NET, C# inklusive Syntax-Highlighting
-Automatisch ein- und ausblendbare Toolfenster
-Integrierte Hilfefunktion (MSDN) und kontextbezogene Hilfe (dynamic help)
-Sourcecode lässt sich wahlweise ein- bzw. ausblenden, zum Beispiel über das De- finieren von bestimmten Regionen
-Visuelles Programmieren, d. h. von Assistenten automatisch generierter Code
-Erstellung von Web-Applikationen in ein und derselben Umgebung75
2.5.2 Ausgewählte Merkmale von Visual Studio .NET
Gliederungsstruktur eines Projektes innerhalb der IDE
Beim Entwickeln einer neuen Anwendung erzeugt Visual Studio .NET standardmäßig so- wohl eine Projektdatei (.vbproj) als auch eine Projektarbeitsmappe (die Solution .sln) für das Speichern der einzelnen Projektdateien. Innerhalb der Solution können mehrere Pro- jekte existieren bzw. in Beziehung stehen und Daten untereinander austauschen, zum Beispiel in Form von Datenbankprojekten, Setup-Routinen oder aber auch Web-Anwen- dungen. Projekte fassen dabei alle Dateien zusammen, die notwendig sind für das Aus- führen eines bestimmten Programms, z. B. Verweise, Formulare oder Assemblies.76.
Der Inhalt der Solution (Projektmappe) wird vom so genannten Solution Explorer hierarchisch verwaltet.
[...]
1 Monadjemi, (2002), S. 17
2 vgl. Winfuture Webseite
3 vgl. Unternehmensplanspiel Webseite
4 vgl. Monadjemi, (2002), S. 49f
5 vgl. Monadjemi, (2002), S. 77
6 Idee, Programmentwicklung und Datenbankdesign von Prof. Dr. Walter Lösel
7 vgl. „BiZ-Player“-Spielanleitung
8 vgl. Hansen / Neumann, (2001), S. 936
9 vgl. Bayer, (2002), S. 175f, S. 178
10 vgl. Doberenz / Kowalski, (2002), S. 44
11 vgl. MVPS Webseite
12 vgl. Connell, (2002), S. 114
13 vgl. VBarchiv Webseite
14 vgl. Connell, (2002), S. 42f
15 vgl. Webseite MWeb
16 vgl. Fellner, (2002), S. 46f; vgl. Monadjemi, (2002), S. 58f
17 vgl. Monadjemi, (2002), S. 84f
18 vgl. Steinbuch, P. / Steinbuch, A., (1999), S. 26, S. 37
19 vgl. Steinbuch, P. / Steinbuch, A., (1999), S. 27f
20 vgl. Spitta, (1989), S. 1
21 vgl. Steinbuch, P. / Steinbuch, A., (1999), S. 28
22 vgl. Koreimann, (1995), S. 235
23 vgl. Thaller, (2000), S. 24
24 gesprochen als Dotnet; durch den Punkt will Microsoft den Bezug zum Internet hervorheben. vgl. Monadjemi / Groth, (2001), S. 33
25 vgl. Connell, (2002), S. 131; vgl. Fellner, (2002), S. 29
26 vgl. Bayer, (2002), S. 25
27 vgl. Fellner, (2002), S. 23
28 vgl. Monadjemi / Groth, (2001), S. 16
29 vgl. Beer / Birngruber / Mössenböck / Wöß, (2003), S. 13
30 vgl. Eisenmener, (2002), S. 3ff
31 vgl. Microsoft Webseite; vgl. Fellner, (2002), S. 28; vgl. Kratschmer, (2002), S. 18f
32 Doberenz / Kowalski, (2002), S. 80; vgl. Kratschmer, (2002), S. 18
33 vgl. Connell, (2002), S. 4; vgl. Kratschmer, (2002), S. 17
34 vgl. Connell, (2002), S. 7; vgl. Fellner, (2002), S. 22, S. 54ff; vgl. Monadjemi, (2002), S. 70f
35 vgl. Monadjemi / Groth, (2001), S. 34; vgl. Kratschmer, (2002), S. 22
36 vgl. Beer / Birngruber / Mössenböck / Wöß, (2003), S. 10f
37 vgl. MONO-Projekt Webseite; vgl. DOTGNU-Projekt Webseite
38 vgl. Kratschmer, (2002), S. 18
39 vgl. Kratschmer, (2002), S. 20
40 gesprochen als C Sharp bzw. JAVA Sharp
41 vgl. Beer / Birngruber / Mössenböck / Wöß, (2003), S. 11; vgl. Monadjemi, (2002), S. 73f
42 vgl. Bayer, (2002), S. 30; vgl. Connell, (2002), S. 7
43 vgl. Bayer, (2002), S. 102; vgl. Monadjemi / Groth, (2001), S. 65; vgl. Monadjemi, (2002), S. 73
44 vgl. Microsoft Webseite (offizielle Preistabelle)
45 vgl. Contentmanager Webseite
46 vgl. Kent, (2002), S. 23f; vgl. Hansen / Neumann, (2001), S. 942
47 vgl. Hansen / Neumann, (2001), S. 939f
48 vgl. Webseite Uni Bielefeld
49 vgl. Hansen / Neumann, (2001) S. 962ff
50 vgl. Kratschmer, (2002), S. 99ff
51 vgl. Beer / Birngruber / Mössenböck / Wöß, (2003), S. 12; vgl. net-lexikon Webseite
52 vgl. Hansen / Neumann, (2001), S. 157; vgl. Eisenmener, (2002), S. 17
53 vgl. Doberenz / Kowalski, (2002), S. 31
54 vgl. Doberenz / Kowalski, (2002), S. 82
55 vgl. Connell, (2002), S. 9; vgl. Kratschmer, (2002), S. 26
56 vgl. Doberenz / Kowalski, (2002), S. 84
57 vgl. Hansen / Neumann, (2001), S. 970; vgl. Userchannel Webseite
58 vgl. Eisenmener, (2002), S. 13
59 vgl. Eisenmener, (2002), S. 13
60 vgl. Monadjemi, (2002), S. 53
61 vgl. Eisenmener, (2002), S. 16 (Stichwort: Reverse Engineering)
62 vgl. Webseite IT-VISIONS.de
63 Doberenz / Kowalski, (2002), S. 84
64 vgl. Doberenz / Kowalski, (2002), S. 84; vgl. Connell, (2002), S. 8
65 vgl. Monadjemi, (2002), S. 56
66 vgl. Beer / Birngruber / Mössenböck / Wöß, (2003), S. 125; vgl. Monadjemi / Groth, (2001), S. 66
67 vgl. Monadjemi (2002), S. 50f
68 vgl. Eisenmener, (2002), S. 15;
69 vgl. Connell, (2002), S. 17
70 vgl. Connell, (2002), S. 11
71 vgl. Kratschmer (2002), S. 20f
72 vgl. Kratschmer, (2002), S. 67; vgl. Microsoft Webseite (Entwicklerprodukte)
73 vgl. Fellner, (2002), S. 60
74 vgl. Monadjemi, (2002), S. 393
75 vgl. Fellner, (2002), S. 65
76 vgl. Doberenz / Kowalski, (2002), S. 49f
-
-
-
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X. -
-
¡Carge sus propios textos! Gane dinero y un iPhone X.