Neue Mobilität
.NET Compact Framework 2.0 &
SQL Server 2005 Mobile Edition
Frank Prengel
Developer Evangelist
Developer Platform & Strategy Group
Microsoft Deutschland GmbH
http://blogs.msdn.com/frankpr
http://www.frankpr.de
Agenda
Intro
.NET Compact Framework 1.0 + SQLCE 2.0
Was geht?
Was geht nicht?
Workarounds
.NET Compact Framework 2.0 + SQL Mobile
Was ist neu?
Future Windows Mobile
Managed APIs
Sie können gewinnen!
Intro
Windows Mobile?
Smartphone?
Windows CE?
Phone Edition?
Second Edition?
Pocket PC?
.NET Compact Framework 1.0
System.Web
Services
Description
UI
HtmlControls
Discovery
WebControls
System.WinForms
Design
ComponentModel
System.Drawing
Protocols
Caching
Security
Drawing2D
Printing
Configuration
SessionState
Imaging
Text
System.Data
System.Xml
ADO.NET
SqlClient
XmlDocument
Serialization
Design
SqlServerCe
Xslt/XPath
Reader/Writers
System
Collections
IO
Configuration
common language
runtime
Security
Net
ServiceProcess
Text
Reflection
Diagnostics
Globalization
Resources
Threading
InteropServices
Remoting
Serialization
nicht unterstützt
verfügbar
Entwicklung mit dem CF
Webservices
SOAP
Visual Studio.NET
Smart Device Extensions
Code
.NET Compact Framework
"Desktop-Version"
.NET Compact
Framework
Windows
Device OS
Entwicklermaschine
Endgerät
Unterstützte APIs
Common Base Classes
IO, Collections, Reflection, math. Funktionen,
Zeichnen, Text
Connectivity
Networking, HTTP-Klassen, Aufrufen von
Web Services
Datenzugriff
ADO.NET, SQL Server CE, SQL Server
XML
XmlDocument, XmlReader/Writer
Windows Forms
Custom Controls
Vergleich der Versionen
PPC
Desktop
SP
CF 2.0
P/Invoke
Win32-Aufrufe als Ersatz für fehlende
Funktionalität
Beschränkungen:
Pass by value: nur Typen <= 32 Bit (auch Structs!)
Pass by value: keine Floats
kein explizites Struct-Layout (nur "Sequential")
keine Strings oder Arrays in Structs
keine Funktionszeiger
 keine Callbacks
kein DateTime
kein MarshalAs-Attribut
Pocket PC & Smartphone
"out of the box" in VS.NET 2003:
Pocket PC 2002
DLLs, Emulator
kein Smartphone 2002!
CF-Unterstützung zur .NET-Programmierung:
Pocket PC 2003 SDK
Emulatoren
Smartphone 2003 SDK
DLLs, Emulatoren
demo
Smartphone Games
Lutz Roeder's Digger
Was fehlt?
Wichtige Controls & UI-Features
User Controls
Visual Inheritance
Security :-(
Code Access Security
Kryptographie
Typisierte DataSets
Vorsicht bei Verwendung von Webservices
Komfortable Tools für Daten & SQLCE
WSE, Application Building Blocks, ...
Was fehlt noch?
ASP.NET
COM Interop
XSLT, XPath
Remoting
Serialisierung (SOAP, binary)
Install-time JIT (nGen)
Managed POOM, Telephonie etc.
“Inherited does not mean
supported.”
– Seth Demsey,
.NET Compact Framework Team,
Microsoft Corporation
... oder: Warum
bleibt mein Button
grau?
Was tun?
Tip: OpenNETCF
demo
PocketRK
Web Services
COM Interop & Inking mit CFCOM
Visual Inheritance "Light"
SQL Server CE 2.0
kompakte relationale Datenbank (< 2 MB)
SQL-Syntax (kompat. mit SQL Server 2000)
hohe Performance durch Query Optimizer
unterstützt Replikation & Synchronisation
128-Bit-Verschlüsselung der DB
Zugriff per ADO.NET, ADOCE, OLEDBCE
unterstützt Transaktionen
Mgmt. Tool (ISQLW) auf dem Gerät
SQLCE & ADO.NET
Zugriff vom CF
System.Data.SqlServerCe
SqlCeEngine, SqlCeConnection, SqlCeCommand, ...
SqlCeDataReader, SqlCeDataAdapter
Referenzieren von SqlServerCe  Deployment von
SQLCE auf Gerät oder Emulator
public void CreateDatabase() {
if (!File.Exists(@”\My Documents\My Data.sdf”)) {
string connStr =
@“Data Source=\My Documents\My Data.sdf” ;
SqlCeEngine engine = new SqlCeEngine(connStr);
engine.CreateDatabase();
}
}
Datenabgleich (1)
muß Besonderheiten mobiler Anwendungen
berücksichtigen
Firewalls
Netzwerk"aussetzer"
unauffällig im Hintergrund
zwei Möglichkeiten:
Remote Data Access (RDA)
Merge Replication
Datenabgleich (2)
Architektur
Application
SQL CE Client Agent
OLE DB
SQL CE Engine
HTTP
SQL CE
Server
Agent
OLE DB
SQL Server
OLE DB
Provider
Internet
Information
Server (IIS)
SQL 2000
Database
Database
Remote Data Access
lose Kopplung SQLCE  SQL Server
keine "Verbindung", sondern HTTP
Query-Resultate lokal gespeichert
Änderungen können zurückgeschrieben werden
Zugang im CF: SqlCeRemoteDataAccess
RDA Pull: lokale Tabelle aus Servertabelle
oder Stored Procedure
RDA Push: lokale Änderungen zurück an den
Server
Table Tracking muß eingeschaltet sein
RDA Pull/Push
public void RDAPull(){
SqlCeRemoteDataAccess rda = new SqlCeRemoteDataAccess();
public void RDAPush(){
SqlCeRemoteDataAccess
rda = new SqlCeRemoteDataAccess();
string ServerOledbStr
=
“Provider=sqloledb; Data Source=dataserver;”+
string ServerOledbStr
=
“Initial Catalog=Pubs;User
Id=sa;Password=;”;
“Provider=sqloledb; Data Source=dataserver;”+
Catalog=Pubs;User Id=sa;Password=;”;
rda.LocalConnectionString“Initial
=
@”Provider=Microsoft.SQLSERVER.OLEDB.CE.2.0;” +
rda.LocalConnectionString
=
@”Data Source=\My
Documents\test.sdf”;
@”Provider=Microsoft.SQLSERVER.OLEDB.CE.2.0;” +
@”Data Source=\My Documents\test.sdf”;
rda.InternetURL =
@“http://www.dataserver.com/sqlce/sscesa20.dll”;
rda.InternetURL =
@“http://www.dataserver.com/sqlce/sscesa20.dll”;
rda.InternetLogin = “MyDomain\someuser”;
rda.InternetLogin
= “MyDomain\someuser”;
rda.InternetPassword
= “HaRd2GuEsS!$*”;
rda.InternetPassword = “HaRd2GuEsS!$*”;
rda.Pull(
“Authors”,
rda.Push(
“Select * from
authors where state = ‘CA’”,
ServerOledbStr, “Authors”,
ServerOledbStr,
RdaTrackOption.TrackingOn);
RdaBatchOption.BatchingOn);
}
}
Merge Replication
Datensynchronisation SQLCE  SQL Server
über HTTP
SQLCE erhält Snapshot vom Server
Änderung auf beiden Seiten möglich
Abgleich beim nächsten Synchronisieren
anpaßbare Konfliktbehandlung
Server agiert als Subscription Publisher
zusätzliche Serverlast & Ressourcen!
Verwendung im CF: SqlCeReplication
RDA oder Merge Replication?
RDA ist "kostengünstiger"
benutzen, wenn begrenzte Funktionalität ausreicht
Merge Replication bietet "Komplettlösung"
aber: belastet Server & Netzwerk mehr
demo
SQLCE & RDA
Traffic
Probleme mit SQLCE 2.0
Single-User/-Proc DB
keine Mgmt.-Tools für den Desktop
keine Trigger, Stored Procedures
nur eine Subscription pro DB (Merge Repl.)
DB wächst unbegrenzt
 SqlCeEngine.Compact
DataReader oder DataSet
kein scrollable Cursor
keine Unterstützung für Smartphone
Fazit CF 1.0 & SQLCE 2.0
vertraute .NET-Entwicklung für mobile Geräte
RAD, Webanbindung, kompakte Datenbank
viele Wünsche offen, aber...
3rd Party-Apps & Community-Unterstützung
Literatur
Tools, Infos & Programme
für Windows Mobile Entwickler
1.
2.
3.
Machen Sie sich schlau im Windows Mobile Developer Center:
Im Developer Center finden Sie relevante Informationen aus
erster Hand: Entwicklungstools, Online Communities,
Webcasts, Technische Artikel, Downloads und vieles mehr.
Werden Sie Mitglied im Windows Mobile Solutions Partner
Programm:
Hier erhalten Developer Unterstützung bei der Entwicklung
und Vermarktung von Windows Mobile Lösungen.
Zertifizieren Sie Ihre Anwendung über Mobile2Market
und erhalten ein Qualitätssiegel für Ihre Windows Mobile
basierten Anwendungen.
http://www.microsoft.com/germany/ms/mobile/entwickler
Neue Welten
Introducing...
Allgemeines
näher am "vollen" .NET Framework 
neue Klassen, Protokolle, Funktionalität
Kompatibilität mit Version 1.0
SxS, <supportedRuntime …/>
Performance
neuer JIT-Compiler
besseres Stringhandling
.NETCF 1.0
(ROM)
.NETCF 2.0
Unterstützung der Whidbey-Features
Generics, partielle Klassen, Iteratoren, anonyme
Methoden
Windows.Forms
Visual Inheritance (!)
User Controls (!)
Bildschirmorientierung
Bildschirmauflösung
Clipboard
Control.DoubleClick 
Docking
Anchoring
Neue Controls
DateTimePicker
MonthCalendar
DocumentList
LinkLabel
Notification Bubble
Help
WebBrowser
DataContainer
Splitter
RichInk
demo
CF WinForms 2.0
Neue Controls
Neue Features
P/Invoke - Neues
Strings & Arrays in Structs
Marshaling von Delegates als
Funktionszeiger
Attribut MarshalAs
explizites Struct-Layout
Floats und DateTime
Typen > 32 Bit können by value übergeben
werden
COM Interop
Version 1.0
Application Code
Managed Wrapper
P/Invoke
Version 2.0
Managed Wrapper wird
generiert (VS oder
TLBIMP.EXE)
Projekt verweist auf
Wrapper
COM-Interfaces & -typen
verwenden wie .NETTypen
COM Object
Managed Call
Managed
Interfaces
.NET CF Interop
Layer
Native Wrapper
COM Call
Application Code
COM Call
Your Code
Generated
COM Object
COM Object
CF: COM aus .NET aufrufen
Threads als MTA initialisiert
verantwortlich:
System.Runtime.InteropServices
Marshal, MarshalAs
keine Unterstützung für Custom Marshaler
IDispatch-Einschränkungen
keine Structures (VT_RECORD)
keine Int64, UInt64
kein automatisches ActiveX-Control-Hosting
Infrastruktur für eigene Wrapper vorhanden
demo
COM Interop
POOM
Netzwerk & Web Services
System.Messaging
Web Services
Performancesteigerung durch
schnelleren XmlSerializer
Unterstützung für SOAP 1.2
CredentialCache
verbesserte Authentifizierung
Kerberos & NTLM
IPv6
Weiteres
System.IO.Ports  serieller Port
System.Security.Cryptography
(Triple)DES, MD5, SHA1, DSA, RSA, Rijndael, ...
X.509
System.Xml
XPath 1.0
Schemavalidierung
System.Drawing
Image.Save(...), custom pens
Smartphone-Unterstützung
Daten
SQL Mobile
DataGrid
Textbox: Wechsel der
Eingabeart (abc, 123, T9, ...)
 InputModeEditor
linkes Menü unterstützt
mehrere Menüpunkte
Visual Studio 2005
IDE für CF-Entwicklung ab Standard Edition
CF nicht von Express Edition unterstützt
native (C++) Device-Programmierung
Ersatz für eMbedded VC++
MFC 8.0, ATL 8.0 (auch für Smartphone), STL, CRT
neue Forms-Designer
neuer Emulator
Sichern verschiedener Zustände
Windows Mobile Development
Visual Studio 2005
Managed
Native
MFC
ATL
Server side
ASP .NET
Mobile Controls
.NET Compact
Framework 2.0
Win32
Software Platform (APIs)
Device Management
Communication
Presentation
Data Access
Remote API
Configuration*
Bluetooth
Security
State & Notifi. *
Pocket Watson
Connection Manager
TAPI*
SMS*
MAPI*
POOM*
ActiveSync
Multimedia
Home Screen
User Interface/Shell
HTML Control
DOM
SQL CE
ADO CE
XML
CE DB
OLE DB
GAPI
Camera
D3DM
Location*
Windows Mobile
Windows CE
CE DB
ActiveSync
SQL CE
Pocket Outlook
Pocket Internet Explorer
Windows Media Player
Drivers
Device
Hardware
Processor
Memory
Display
USB or Serial
Radio
* = Managed wrappers
GSM/GPRS
CDMA/1xRTT
WiFi
Bluetooth
Introducing...
SQL Mobile
kommt mit SQL Server 2005 und VS 2005
Integration in die SQL Workbench
gleiche Oberfläche wie SQL Server 2005
Integration mit CF 2.0
Unterstützung für
Pocket PC, PPC Phone Edition (ab WM2003)
Smartphone (ab WM2003)
Windows CE 5.0 (kein CE 4.x)
Win32 (Tablet PC, Deployment)
Neue Features
Multi-User-Unterstützung
Row Level Locking (Data)
Page Level Locking (Index)
mehr Stabilität
ACID-Transaktionen
Named Parameters
updateable scrollable cursor:
SqlCeResultSet
SQL Mobile & VS 2005
Integration in Server Explorer
Erstellen & Verwalten von SDF auf Desktop, Gerät
oder Emulator
Drag & Drop mit WinForms
Erzeugung gebundener Controls
Smart Tasks für Master-Detail-Ansichten
Performance & Produktivität
typisiertes ResultSet automatisch generiert
Auflistung in DataSource-Fenster
Unterstützung von Projekt & Deployment
Synchronisation
Multi-User-Sync
Progress Notification
>1 Subscriptions für eine DB
Wizards für Web-Konfiguration & Sync
Custom Resolver in .NET
Unterstützung für SQL Server 2000
Kompression konfigurierbar
Dr. Watson 
Architektur
Native Stack
Enterprise Backend
Managed Stack
XML/BizTalk/CS 2002
VS 2005 (VB.NET & C#)
VS 2005
(C++)
ADO.NET
OLEDB CE
SQL Mobile
Data Provider
OLEDB Provider
SQL Mobile
QP/Cursor
Engine/ES
Storage Engine / Repl
Tracking
SQL Server
Client Data
Provider
CLR / .NET CF
Data Provider
Client
Agent:
Replication
and
RDA
Ethernet
TDS
Well
Connected
802.11b/a/g,
CDPD, GSM,
CDMA,
TDMA, etc.
IIS
HTTP
Occasionally
Connected
CLIENT
SERVER
OLEDB /
Replication API
Server
Agent:
Replication
and
Remote
Data
Access
demo
SQL Mobile
SqlCeResultSet
Admin Tools
Verwendung mit CF 2.0
Merge Replication
And now for s.th. completely
different...
Future
Neues für Entwickler
.NET Compact Framework 2.0-Unterstützung
SQL Mobile-Unterstützung
PIM Store
Managed MAPI, Telephony, POOM
Managed Notifications Broker
D3D Mobile
APIs für Kamera & Location
einheitliches CAB-Format
Dr. Watson
Neue Namensräume
Microsoft.WindowsMobile:
IApplicationLauncher
Microsoft.WindowsMobile.Status
State & Notification
Microsoft.WindowsMobile.Forms
Contact Picker, Picture Picker
Microsoft.WindowsMobile.Configuration
Configuration manager
Microsoft.WindowsMobile.Telephony
Phone
Microsoft.WindowsMobile.PocketOutlook
Contacts, Calendar, Tasks, Email, SMS
Microsoft.WindowsMobile.PocketOutlook.MessageInterception
SMS interception
State & Notifications
einheitliches API zwecks Benachrichtigung,
"wenn etwas passiert"
nutzt dokumentierte Registry-Keys
transient & persistent notifications
State & Notifications
SystemState state;
void Form1_Load( ... )
{
if( SystemState.IsApplicationLauncherEnabled( "MyApp.MissedCall“ ) )
{
state = new SystemState( "MyApp.MissedCall" );
}void MissedCall( object sender, ChangeEventArgs e )
else
{
{
MessageBox.Show( “Missed Calls: “ + e.CurrentValue );
state = new SystemState( SystemProperty.MissedCallCount );
} state.ComparisonType = StatusComparisonType.Greater;
state.ComparisonValue = 0;
state.EnableApplicationLauncher( "MyApp.MissedCall" );
}
state.Changed += new ChangeEventHandler( MissedCall );
// ...
}
Managed POOM
Contacts, Calendar, Tasks
erstellen, ändern, löschen, auflisten, suchen
OutlookSession  Folder  PimItemCollection  PimItem
Change-Events für Eigenschaften (nur in derselben Anwendung)
Transaktionsmodell: Update des Items nach Änderungen notwendig
Erstellen: Default Constructor benutzen, Eigenschaften setzen,
Folder.Add(…) aufrufen
Managed POOM
OutlookSession outlook = new OutlookSession();
Contact c = new Contact();
c.FirstName = "Big";
c.LastName = "Bird";
c.Email1Address = “[email protected]”;
outlook.Contacts.Items.Add(c);
Managed Telephony
Anrufe starten
User Prompt optional
Notifications über Anrufe
durch entspr. API
Private Sub callBack_Click(…) Handles callBack.Click
Dim phone As New Phone
phone.MakeCall( callerNumber, False )
End Sub
Managed MAPI
Microsoft.WindowsMobile.PocketOutlook
Email & SMS
Attachments
EmailMessage m = new EmailMessage();
m.To.Add(new Recipient("Big bird",
"[email protected]");
m.Subject ="How are you?";
m.BodyText = "I hope you're ok";
m.Send();
Dim message As New SmsMessage
message.To.Add( New Recipient( callerNumber ) )
message.Body = "CALL BACK AT " + selectedTime
message.Send()
SMS Interception
MessageInterceptor sms ;
void Form1_Load( ... )
{ void sms_MessageReceived(object sender, MessageReceivedEventArgs e)
{sms = new MessageInterceptor();
sms.MessageCondition
new MessageCondition(
SmsMessage message == (SmsMessage)(e.Message);
MessageProperty.Body,
MessageComparisonType.StartsWith, “Foo” );
//
...
}sms.InterceptionAction = InterceptionAction.NotifyAndDelete;
sms.MessageReceived +=
new MessageReceivedEventHandler( sms_MessageReceived );
}
Managed Config. Manager
string filename = @"\Storage Card\2577\config.xml";
XmlDocument config = new XmlDocument();
config.Load( filename );
ConfigurationManager.ProcessConfiguration( config, true );
<wap-provisioningdoc>
<characteristic type="Sync">
<characteristic type="Connection">
<parm name="User" value="frankpr"/>
<parm name="Server" value="emea.mail.microsoft.com"/>
<parm name="Domain" value="EUROPE"/>
</characteristic>
<characteristic type="Mail">
<parm name="Enabled" value="1"/>
</characteristic>
</characteristic>
</wap-provisioningdoc>
Windows Mobile Roadmap
Geräte
2000
Core OS
Entwicklung
PlattformFeatures
2002
2003
2003
Second Edition
Future
Windows Mobile
WinCE 3.0
WinCE 3.0
WinCE 4.2
WinCE 4.2
WinCE 5.0
eVC 3 (C++)
eVB 3 (VB)
eVC 3 (C++)
eVB 3 (VB)
eVB 3 (C++)
eVC 4 (C++)
VS.NET 2003
eVB 3 (C++)
eVC 4 (C++)
VS.NET 2003
Visual Studio 2005
(C#, VB.NET)
(C#, VB.NET)
MFC 3.0
MFC 3.0, ATL 3.0
.NET CF
.NET CF SP2
Win32,
POOM
Active Sync
Connection Mgr
MAPI
OBEX
Telephony
Enhanced Emulator
Configuration Mgr,
Bluetooth, SMS
VGA (PPC)
Square (PPC)
Landscape (PPC)
QVGA (SP)
(C#, VB.NET, C++)
.NET CF 2.0, MFC 8.0,
ATL 8.0
State & Notification,
Location, Camera,
SQL CE, D3DM,
Managed wrappers
Fazit
Mehr Performance in CF & SQL Mobile!
Mehr Interoperabilität durch COM Interop &
besseres P/Invoke!
Mehr Produktivität &
Spaß beim Entwickeln!
Future Windows Mobile
hebt ab!
Anregungen?
Lob?
Bahnhof?
Wünsche?
Fragen?
Geldspenden?
Kritik?
Danksagungen?
Vielen Dank!
© 2004 Microsoft Corporation. All rights reserved.
This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.