WAY AHEAD™
Native Development for Windows Phone
The Windows Runtime API and Modern C++
2
» Senior Software Engineer at ALK Technologies» Led development effort to bring CoPilot GPS
navigation app to Windows Phone 8» #4 Free Navigation App in Window Phone store
» Windows Phone Dev by day and night» Released 6 of my own apps to Windows Phone store
» Blog: www.robwirving.com» Twitter: @robwirving
Rob Irving
3
» History of Native on Windows Phone» Why use Native?» C++ 11» Windows Runtime (WinRT)» Component Extensions (C++/CX)» Options in Visual Studio» Sample Code» Q & A
Agenda
4
» Lack of Native Development on WP7 hurt the platform» Lack of high-end games available on other platforms» More difficult/impossible to port existing apps from
other platforms
» Support for Native Development is the single largest change in the WP8 SDK
» Native Gaming and Middleware products» Unity 3D, Havok, Cocos 2D, etc.
History of Native on Windows Phone
WAY AHEAD™
Why use Native?
6
» Reusability» Existing code that you don’t want to rewrite» Use of existing 3rd party libraries (SQLite)
» Portability» Share code between Windows, iOS and Android» Write once, use it everywhere
Why use Native?
7
» Game development with high-end graphics» Direct3D on Windows and Windows Phone» OpenGL on iOS and Android
» Performance» Should not be viewed as the main reason to use C++» Performance can be better using Native, but is often
exaggerated
Why use Native?
8
» Portability & Reusability in action» ~1,000 Lines of C# for WP8» ~7,000 Lines of new C++ and C++/CX » ~800,000 Lines of existing C++ code
»~99% shared code between Windows Phone, iOS and Android!
CoPilot GPS – Native Case Study
WAY AHEAD™ A brief introduction to Modern C++
C++ 11
10
1979
1983
1998 2011
History of C++C++ began as anenhancementto C at Bell Labs
Originally named‘C with Classes’
Renamed to C++
C++ ISO committee defined C++ 98
No significant changes to C++ for 13 years
C++ ISO committee defined C++ 11
New features heavily influenced by managed languages like .NET
11
» Type inference (auto)» Avoid explicitly declaring the type of a variable» Similar to .NET ‘var’ keyword
» Lambdas» Anonymous inline functions
C++ 11 Features
int num1 = 10;double num2 = 2.5
auto num3 = num1 / num2;
std::vector<CityLocation> cities;
std::sort(begin(cities), end(cities), [](CityLocation a, CityLocation b){ return a.distance < b.distance;});
12
» Strongly type enums
» Foreach-ish loop
C++ 11 Features
int numbers[] = {0, 1, 2, 3, 4, 5};int sum = 0;
for(int& number : numbers){ sum += number;}
enum class Fruit{ Apple, Banana, Orange};
if(meal.Fruit == Fruit::Banana) // do Banana stuff
int fruitAbomination = Apple + Orange; // ERROR - Can’t do this anymore
WAY AHEAD™
Windows Runtime API
14
» Shared API between Windows Phone 8 and Windows Store Apps» Overlaps much of the existing Windows Phone .NET
API» Not all APIs are available for both
» ~11,000 Windows Runtime
» ~2,800 for both
» ~600 Windows Phone Runtime
Windows Runtime API (WinRT)
15
» API is a COM-based Native API
» Accessible from C#, VB.NET and Component Extensions (C++/CX)» Also Javascript on Windows 8
» API definitions in Windows Metadata (.winmd) files» Similar format to .NET API definitions
Windows Runtime API (WinRT)
16
» Native / Managed Interop» WinRT is the only supported method of interop
» The most painful parts of Native /Managed interop are gone with Windows Runtime» No P/Invoke» No Marshalling
Native Interop is easy with WinRT
WAY AHEAD™
Component Extensions (C++/CX)
18
» Syntax and Library abstractions to interact with COM based WinRT API
» Much easier to develop for compared to old COM programming
Component Extensions (C++/CX)
19
» Syntactically similar to C++/CLI» ‘ref’ and ‘sealed’ classes » Reference pointers or ‘hats’ ^
Component Extensions (C++/CX)
public ref class Foo sealed{};
Foo^ foo = ref new Foo();
20
» Differences from C++/CLI» No managed CLR» No Garbage Collection, ref counted objects instead» ref new instead of gcnew» Pure C++ classes allowed in C++/CX classes» Global ref ptr’s allowed
Component Extensions (C++/CX)
21
» Properties» No value keyword» Can’t have public get, private set
Component Extensions (C++/CX)
public ref class Foobar sealed{ public: property int Foo; // automatic/trivial property property int Bar { int get() { return _bar; } void set(int newBar) { if(newBar > 0) _bar = newBar; } }
private: int _bar;};
22
» Events » Very similar to .NET events» Unsubscribe using token
Component Extensions (C++/CX)
MyClass::MyClass(){ geoLocator = ref new Geolocator(); // subscribe eventToken = geoLocator->PositionChanged += ref new TypedEventHandler<Geolocator^, PositionChangedEventArgs^>(this, &MyClass::OnPosChanged);}
MyClass::~MyClass(){ // unsubscribe geoLocator->PositionChanged -= eventToken;}
void MyClass::OnPosChanged(Geolocator^ geoLocator, PositionChangedEventArgs^ args){ auto geoPos = args->Position->Coordinate;}
23
» XAML with Direct 3D
Options in Visual Studio
24
» Several Native Projects available
Options in Visual Studio
WAY AHEAD™
Visual Studio Demo
26
Additional Resources
Windows Phone 8 Development Internals(Whitchapel, McKenna)http://amzn.to/1a2989c
Modern C++ and Windows Store Apps(Poduri)http://amzn.to/GEW6Y4
27
» Channel 9 – channel9.msdn.com» Build 2012 Sessions
channel9.msdn.com/Events/Build/2012/
» Build 2013 Sessions channel9.msdn.com/Events/Build/2013/
» Going Native channel9.msdn.com/Shows/C9-GoingNative
» C++ 11 Features in Visual C++ 11blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
Additional Resources
28
» Questions & Answers
» Slides will be posted to blog: robwirving.com
Thank You!