Visual Basic .NET und Visual Basic 6 Ralf Westphal MSDN Regional Director, freier Fachautor & Berater [email protected].

Download Report

Transcript Visual Basic .NET und Visual Basic 6 Ralf Westphal MSDN Regional Director, freier Fachautor & Berater [email protected].

Visual Basic .NET
und Visual Basic 6
Ralf Westphal
MSDN Regional Director,
freier Fachautor & Berater
[email protected]
Von VB6 zu VB.NET
VB6
Allgm. Sprachen
.NET CLR
.NET Sprachen
VB.NET
Was macht VB6 aus?







Einfache GUI-Gestaltung
Einfacher DB-Umgang
Einfacher Umgang mit Strings
Einfache APIs
•
Intrinsische Funktionen, Declare, COM
Einfache Erzeugung von Komponenten
•
ActiveX-DLLs, UserControls
Einfache Syntax
•
„dot-Syntax“, keine Zeiger, Kontrollstrukturen
Einfache Semantik
•
Klassen, Objekt-Destruktor, Eval. Logischer
Ausdrücke
VB6 allgemein







Syntax
Semantik
GUI RAD
Datenbankzugriff
Typsystem
•
OO-/Komponententechnologie
Standardbibliothek
APIs
Von VB6 zu VB.NET
VB6
Sprachen allgm.
.NET CLR
.NET Sprachen
VB.NET
Programmiersprachen allgemein


Was gehört zu einer Sprache?
•
•
•
Syntax
Semantik
Programmierparadigma
Was gehört nicht zu einer Sprache?
•
•
•
•
•
UI-Gestaltung
Datenbankzugriff
Typsystem
Standardbibliothek
APIs
Von VB6 zu VB.NET
VB6
Allgm. Sprachen
.NET CLR
.NET Sprachen
VB.NET
Warum eine Runtime?
Einheitliches Integrationsmodell
SprachIntegration
Layer
(VBRUNxx.DLL)
(ATL.DLL)
Kontext
Concurrency
Transaktionen
Microsoft
Transaction
Server
(MTXEX.DLL)
Class-Loader
Remoting
COM Runtime
(OLE32.DLL)
Layer
(VBRUNxx.DLL)
(ATL.DLL)
COM+ Runtime
(OLE32.DLL)
Common
Language
Runtime
(MSCOREE.DLL)
(MSCORLIB.DLL)
.NET Framework
VB
C++
C#
JScript
…
Common Language Specification
User
Interface
Data and XML
Base Class Library
Common Language Runtime
Visual Studio.NET
Web
Services
Common Language Runtime
Thread Support
COM Marshaler
Type Checker
Exception Manager
Security Engine
Debug Engine
IL to Native
Compilers
Code
Manager
Class Loader
Garbage
Collector
Basics
Microsoft Intermediate Language

Compiler erzeugen keinen native Code
sondern eine prozessorunabhängige
Zwischensprache
•
•

Sprachintegration erfolgt auf IL-Codeebene
MSIL – Microsoft Intermediate Language
IL-Code wird vor der Ausführung immer (!)
durch Compiler in echten Maschinencode
übersetzt
•
•
Unabhängigkeit von Hardwareplattformen
Unter Windows CE bereits mit einem
IL-Vorläufer im Einsatz
Hello, World!
C#
VB.NET
using System;
Imports System
namespace HelloWorld
{
public class Class1
{
public static void Main()
{
Console.WriteLine("Hello, World!");
}
}
}
Namespace HelloWorld
Class Class1
Shared Sub Main()
Console.WriteLine("Hello, World!")
End Sub
End Class
End Namespace
Alternativ:
Module Module1
Sub Main()
Console.WriteLine("Hello, World!")
End Sub
End Module
Hello, World: VB.NET IL
.namespace Project3.HelloWorld
{
.class private auto ansi Class1
extends [mscorlib]System.Object
{
.method public specialname rtspecialname
instance void .ctor() il managed
{
.custom instance void [mscorlib]System.Diagnostics.DebuggerStepThroughAttribute::.ctor() = ( 01 00 00 00 )
.maxstack 8
IL_0000: ldarg.0
IL_0001: call
instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
}
.method public static void Main() il managed
{
.maxstack 1
.locals init ([0] class System.Object[] _Vb_t_record_0)
IL_0000: nop
IL_0001: ldstr
"Hello, World!"
IL_0006: call
void [mscorlib]System.Console::WriteLine(class System.String)
IL_000b: nop
IL_000c: ret
}
}
}
.namespace Project3
{
.class private auto ansi _vbProject
extends [mscorlib]System.Object
{
.custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.Globals/Globals$StandardModuleAttribute::.ctor() = ( 01 00 00 00 )
.method public static void _main(class System.String[] _s) il managed
{
.entrypoint
.maxstack 8
IL_0000: call
void Project3.HelloWorld.Class1::Main()
IL_0005: ret
}
}
}
Hello, World: C# IL
.namespace HelloWorld
{
.class public auto ansi Class1
extends [mscorlib]System.Object
{
.method public hidebysig static void Main() il managed
{
.entrypoint
.maxstack 8
IL_0000: ldstr
"Hello, World!"
IL_0005: call
void [mscorlib]System.Console::WriteLine(class System.String)
IL_000a: ret
}
.method public hidebysig specialname rtspecialname
instance void .ctor() il managed
{
.maxstack 8
IL_0000: ldarg.0
IL_0001: call
instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
}
}
}
Hello, World: VB.NET IL (Alternativ)
.namespace HelloWorld
{
.class private auto ansi Module1
extends [mscorlib]System.Object
{
.custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.Globals/Globals$StandardModuleAttribute::.ctor() = ( 01 00 00 00 )
.method public static void Main() il managed
{
.maxstack 1
.locals init ([0] class System.Object[] _Vb_t_record_0)
IL_0000: nop
IL_0001: ldstr
"Hello, World!"
IL_0006: call
void [mscorlib]System.Console::WriteLine(class System.String)
IL_000b: nop
IL_000c: ret
}
}
.class private auto ansi _vbProject
extends [mscorlib]System.Object
{
.custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.Globals/Globals$StandardModuleAttribute::.ctor() = ( 01 00 00 00 )
.method public static void _main(class System.String[] _s) il managed
{
.entrypoint
.maxstack 8
IL_0000: call
void ConsoleApplication9.Module1::Main()
IL_0005: ret
}
}
}
Basics
Managed Code

Sämtlicher Code wird unter Aufsicht der
Common Language Runtime ausgeführt
•
•
•
•
Runtime führt Sicherheitsüberprüfungen aus
Runtime übernimmt Speicherverwaltung und
Fehlerbehandlung (Garbage Collection)
Runtime führt Versionsprüfungen aus
Dieser Code wird als Managed Code bezeichnet
Von VB6 zu VB.NET
VB6
Allgm. Sprachen
.NET CLR
.NET Sprachen
VB.NET
Basics
Common Type System

Das Typsystem wandert vom
Compiler in die Runtime
•
•
•
Typen werden eindeutig
•
„ein String unter C# und ein String unter
VB.NET sind identisch“
Sprachen werden interoperabel, da sie
das gleiche Typsystem benutzen
CTS – Common Type System
Common Type System
Das Objektmodell
Object
Value Type
Boolean
Int64
Byte
SByte
Enum
Typen im
Namespace
System
Char
Single
Type
Currency
TimeSpan
DateTime
String
TypedRef.
Decimal
UInt16
Double
Array
UInt32
Guid
UInt64
Exception
Int16
Void
Int32
Delegate
Zwei Arten von Typen
Variable enthält
Speicher
Initialisiert mit
Zuweisung
Value (struct)
Reference (class)
Wert
Referenz
Stack
Heap
Alles 0
Konstante: nothing
kopiert Wert
kopiert Referenz
Dim i as integer = 123
Dim s as string _
= "Hello world"
Dim j as integer = i
Dim t as string = s
i
123
"Hello world"
s
j
t
123
Boxing und Unboxing

Jeder Datentyp kann als Objekt gespeichert
oder übergeben werden
Dim i as integer = 123
Dim o as object = i
Dim j as integer = Ctype(o, Integer)
i
123
o
System.Int32
123
j
123
} “Boxing”
}
“Unboxing”
Warum ein Framework?
Einheitliches Programmiermodell
.NET Framework
VB Forms
MFC & ATL
Windows API
ASP
Base Class Library
System.Web
Services
Description
UI
HtmlControls
Discovery
WebControls
System.WinForms
Design
Protocols
ComponentModel
System.Drawing
Caching
Security
Drawing2D
Printing
Configuration
SessionState
Imaging
Text
System.Data
System.Xml
ADO
SQL
XSLT
Design
SQLTypes
XPath
Serialization
System
Collections
IO
Security
Runtime
InteropServices
Configuration
Net
ServiceProcess
Diagnostics
Reflection
Text
Remoting
Globalization
Resources
Threading
Serialization
Gemeinsamer Nenner aller .NET Sprachen







Codeerzeugung
•
Optimierung durch JITer
Common Type System
•
•
Garbage Collection
COM-Interop, P/Invoke
Sicherheitsinfrastruktur
Attribute
Ausnahmebehandlung
Multithreading
Standardbibliothek
Basics
Implikationen

Sprachen werden gleichwertig, da alle
Compiler MSIL-Code erzeugen
•
•

„eine C# Klasse kann von einer VB.NET Klasse
abgeleitet sein“
einheitliche Fehlerbehandlung
Compilerbau wird einfacher
•
•
•
•
kein eigenes Typsystem
Sprachen sind „per Definition“ interoperabel
keine Standardbibliothek
kein Codeoptimierungspass
Von VB6 zu VB.NET
VB6
Allgm. Sprachen
.NET CLR
.NET Sprachen
VB.NET
VB.NET
Die gute und die schlechte Nachricht

 Mit den .NET Sprachen hat das VBKonzept „gewonnen“
•
•
•

dot-Syntax
Einfache Stringbehandlung
uvm.
 Mit VB.NET verliert VB seine
Alleinstellungsmerkmale
VB.NET


Was gehört zu VB.NET?
•
•
•
Syntax
Semantik
Programmierparadigma
Was gehört zum .NET Framework?
•
•
•
•
•
UI-Gestaltung
Datenbankzugriff
Typsystem
Standardbibliothek
APIs
Was ist neu durch VB.NET?





Tiefgreifende, „echte“ OO-Konzepte
Namespaces
Strukturierte Ausnahmebehandlung
Multithreading
uvm.
Implementation Inheritance
Public Class Mitarbeiter
Public Function Gehalt() As Double
...
End Function
End Interface
Public Class Arbeiter
Inherits Mitarbeiter
Public Property Zulage() As Double
...
End Property
End Interface
Implementation Inheritance





Nur Einfachvererbung
Parametrierte Konstruktoren
Instanz- und Klassen-Member (shared)
Alle Methoden virtuell per default
Abstrakte und finale Klassen/Member
Overloading

Implementation einer Methode
•
•
mehrfach mit dem selben Namen,
aber immer eindeutiger Signatur
Overloads Public Sub Display(ByVal theString As String)
Overloads Public Sub Display(ByVal theDouble As Double)
Overloads Public Sub Display(byVal theInteger As Integer)
Alternative zu optionalen Parametern.
Polymorphy
Public Class Mitarbeiter
Overridable Public Function Gehalt() As Double
Gehalt = Stunden * Stundenlohn
End Function
End Interface
Public Class Arbeiter
Inherits Mitarbeiter
Overrides Function Gehalt() As Double
Gehalt = Stunden * (Stundenlohn + Zulage)
End Function
End Interface
Polymorphy

Neudefinition der Implementation einer
Basisklassenmethode in einer
abgeleiteten Klasse
•
•
•
Muss in Basisklasse zugestanden werden
(Overridable)
Signatur bleibt gleich
Verdeckt Basisklassenimplementation
•
Kann aber über MyBase aufgerufen werden
Interface Inheritance
Interface erbt von Interface
Public Interface Interface1
Public Sub M1()
Public Property P1 As String
End Interface
Public Interface Interface2
Inherits Interface1
Public Sub M2()
Public Property P2 As String
End Interface
Interface Inheritance
Klasse implementiert und erbt Interface
Public Interface Mitarbeiter
Public Sub Gehalt() As Double
End Interface
Public Class Arbeiter
Implements Mitarbeiter
Public Sub Einkommen() As Double Implements Mitarbeiter.Gehalt
....
End Sub
Public Class Vorarbeiter
End Class
Inherits Arbeiter
Erbt auch das Interface und die Implementation von Mitarbeiter
End Class
Interface Inheritance




„Echte“ Interfaces
Jede Klasse kann beliebig viele Interfaces
implementieren
Vererbung von Interfaces
•
•
Ableitung neuer Interfaces
Abgeleitete Klassen erben auch Interfaces
Beliebige Zuordnung von Methoden der
Klasse an Interface-Methoden
Strukturen

Zusammenschluss von
Daten und Code

Werttyp

Keine Vererbung

Leichtgewichtiger
Datencontainer
Structure Point
Private _x, _y As Double
Public Sub New(ByVal x As Double, ByVal y As Double)
_x = x : _y = y
End Sub
Public Property x() As Double
Get
Return _x
End Get
Set(ByVal Value As Double)
_x = Value
End Set
End Property
Public Overrides Function ToString() As String
Return "(" & _x & ", " & _y & ")"
End Function
End Structure
Ausnahmebehandlung
Try
auszuführende Anweisungen
Catch e As COMException
Fehlerbehandlung
Catch e As Exception
...
Catch When Err.Number = 5
...
Catch
...
Finally
Abschließende Behandlung, auch ohne Fehler
End Try
Ausnahmebehandlung



Basiert auf Exception-Objekt/Klasse
•
Eigene Exception-Klassen möglich
Blockorientierte Fehlerbehandlung
•
•
Garantierte Nachbehandlung (finally)
Fehler während der Fehlerbehandlung
(catch) müssen ebenfalls abgefangen
werden
Nicht behandelte Fehler werden im CallStack hochgereicht
Delegates
Delegate
1:1
Empfänger
Multicast
Delegate
1:n
Empfänger
Empfänger
n:1
Delegate
Empfänger
Delegate
Multicast
Delegate
Multicast
Delegate
n:m
Empfänger
Empfänger
Delegates
Delegate Sub MySubDelegate(ByVal x As Integer)
Class MyClass
Sub MySub(ByVal x As Integer)
MessageBox.Show("Der Wert von X ist:" & CStr(x))
End Sub
End Class
Sub Test
Dim mc As New MyClass
Dim msd As New MySubDelegate(AddressOf mc.MySub)
msd.Invoke(10)
msd(10)
End Sub
Delegates
Dim TB1 As TextBox
Dim TB2 As TextBox
Protected Sub MyHandler(ByVal Sender As Object, ByVal e As System.EventArgs)
Dim TB As TextBox
TB = CType(sender, TextBox)
End Class
AddHandler TB1.TextChanged, New System.EventHandler(AddressOf MyHandler)
AddHandler TB2.TextChanged, New System.EventHandler(AddressOf MyHandler)
Delegates


Typisierte Funktionszeiger
•
Sind selbst Typen und damit Objekte
Basis für Ereignisbehandlung
•
•
„Reale“ Funktion muss gleiche Signatur
haben
WithEvents gibt es weiterhin
Attribute
<AttributeUsage(AttributeTargets.All)>
Public Class AutorAttribute
Inherits Attribute
Public name As String
Public project As String
Public Sub New(ByVal name As String)
Me.name = name
End Sub
End Class
<Autor("Westphal", project:="Roadshow")>
Structure Point
...
End Structure
Attribute

Runtime/Design-Time Informationen für Typen und
deren Elemente
•
•
•

Vollständig erweiterbar
•
•
Ein Attribut ist eine Klasse, die von System.Attribute abgeleitet
wurde
Attribute werden erst instanziert, wenn darauf zugegriffen wird
Code ist „self contained“
•
•
Keine neuen Schlüsselwörter oder pragma
Keine zusätzlichen Dateien, z.B.: .IDL, .DEF
Zugriff zur Laufzeit über Reflection API
Beispiele
•
•
•
•
Wird im Framework an vielen Stellen benutzt: XML, Web
Services, Security, Serialization, Component Model, COM
und P/Invoke Interop …
URL für Dokumentation einer Klasse
„Transaction context“ einer Methode
Wie wird in XML persistiert
Multithreading
Class Foo
Sub Baz()
Console.WriteLine("Foo Baz is running on another thread")
End Sub
End Class
Sub main()
Dim oFoo As Foo
oFoo = New Foo()
Dim otter As ThreadStart
otter = New ThreadStart(AddressOf oFoo.Baz)
Dim oThread As Thread
oThread = New Thread(otter)
oThread.Start
End Sub
Multithreading

Thread-Funktionen
•
•
•
Instanz- oder Klassen-Methode
•
•
•
Werden per ThreadStart-Delegate übergeben
Keine Parameter
Kein Funktionsresultat
Cross-Thread-Aufrufe sind transparent
Thread-Kontrolle über Instanz oder Klasse
•
z.B. myThread.Stop
Was ändert sich mit VB.NET? 1/2


Syntax
•
•
•
•
•
Andere Property-Syntax
Structure statt Type
Volle Qualifizierung von Enum-Konstanten
Typzuweisung mit mehreren Vars bei Dim
Klammern bei Sub/Function-Aufrufen
Semantik
•
•
•
•
•
•
•
Gültigkeitsbereich von Blockvariablen
Indeterministische Finalisation
Keine statischen Sub/Function mehr
ByVal ist default
Gleichstellung von Member-Variablen und PropertyMethoden
Default-Methoden müssen Eigenschaften mit einem Param.
sein
Variant entfällt
Was ändert sich mit VB.NET? 2/2



Anweisungen/Funktionen
 Kein Gosub, On/Gosub, On/Goto mehr
 Open/Close etc. jetzt Funktionen
 Kein IsMissing mehr
Umgebung
 Keine Tag-Eigenschaft mehr bei Steuerelementen
 Keine Steuerelementfelder mehr
 Keine fensterlosen Steuerelemente mehr
uvm.
Von VB6 zu VB.NET


 Conversion Wizard
•
•
 COM-Interop
•
•

Funktioniert in Beta 2 noch unzureichend
Probleme vor allem mit UI-bezogenem Code
VB6 COM-Komponenten aus .NET Programmen
nutzen
.NET Komponenten in VB6-Programmen nutzen
Nur komponentenbasierte Anwendungen
werden einigermaßen schmerzfrei migriert
werden können.
Haben Sie sich auch so an VB6 gewöhnt?
Dann ist es jetzt Zeit, auf .NET umzusteigen! 
Call to Action




.NET lernen
•
Nehmen Sie sich Zeit, jede Woche ein wenig dazu
zu lernen
Evaluieren Sie gleichermaßen C# und VB.NET
Probieren Sie den Conversion Wizard aus
Stellen Sie sicher, dass Ihre Anwendungen
komponentenbasiert sind
Fragen!?
Uff...
Mehr Informationen








http://www.microsoft.com/net
http://msdn.microsoft.com/net
http://www.microsoft.com/germany/msdn
http://www.dotnetgerman.com/
http://www.dotnetjumpstart.net/
http://www.gotDotNet.com/
Dan Appleman: Moving to VB.NET:
Strategies, Concepts, and Code; APress 2001
Ralf Westphal: Bist du es, Visual Basic? Teil 1
bis 4; Artikelserie in BasicPro 6/00 ff
VB.NET Quellen 1/2








What's New in Visual Basic (TechEd Präsentation)
http://www.gotdotnet.com/events/teched/slides/dev300_cdias.ppt
Visual Basic .NET: New Programming Model and Language
Enhancements Boost Development Power
http://msdn.microsoft.com/msdnmag/issues/01/02/vbnet/vbnet.asp
Visual Studio Enables the Programmable Web
http://msdn.microsoft.com/vstudio/nextgen/technology/language.asp
Visual Basic .NET Upgrade Roadmap
http://msdn.microsoft.com/vbasic/technical/upgrade/roadmap.asp
The Transition from Visual Basic 6.0 to Visual Basic .NET
http://msdn.microsoft.com/vbasic/technical/upgrade/transition/default.a
sp
10 More Ways to Prepare for VB.NET
http://www.devx.com/upload/free/features/vbpj/2001/03mar01/bh_0103/b
h_0103.asp
Get Your Designs in Gear for VB.NET
http://www.devx.com/upload/free/features/vbpj/2000/11nov00/pr0011/pr0
011.asp
Drill Down on VB.NET
http://www.devx.com/upload/free/features/vbpj/2001/01feb02/jf0102/jf010
2.asp
VB.NET Quellen 2/2









An Introduction to Threading in VB.NET
http://www.asptoday.com/content/articles/20010410.asp?WROXEMPTOKEN=9
34243ZaVjEiid0J0l7LCYvBGK
Object Oriented Features in VB.NET
http://www.asptoday.com/content/articles/20010518.asp?WROXEMPTOKEN=9
34243ZaVjEiid0J0l7LCYvBGK
VB .NET Delegates
http://www.asptoday.com/content/articles/20010619.asp?WROXEMPTOKEN=9
34243ZaVjEiid0J0l7LCYvBGK
Polymorphism in VB.NET
http://www.asptoday.com/content/articles/20010627.asp?WROXEMPTOKEN=9
34243ZaVjEiid0J0l7LCYvBGK
Visual Basic .NET: Tracing, Logging, and Threading Made Easy with .NET
http://msdn.microsoft.com/msdnmag/issues/01/07/vbnet/vbnet.asp
New Features in Visual Basic .NET: Variables, Types, Arrays, and Properties
http://msdn.microsoft.com/msdnmag/issues/01/05/Instincts/Instincts0105.asp
Exploiting New Language Features in Visual Basic .NET, Part 2
http://msdn.microsoft.com/msdnmag/issues/01/08/Instincts/Instincts0108.asp
Visual Basic .NET - 10 More RAD Years
http://msdn.microsoft.com/msdnnews/2001/may/RAD/RAD.asp
Die Qual der Wahl der Sprache
http://www.microsoft.com/germany/ms/msdnbiblio/kolumne/300401RW.htm
Empower people
through great software
any time, any place,
and on any device