C#

Getting started with Xamarin in 2016

Xamarin

Xamarin is a cross-platform mobile development framework that allows you to build native mobile applications with C# and share code between them. There are two approaches:

  • native Xamarin – write native UI code in C# (views cannot be shared, business logic can be shared)
  • Xamarin.Forms – write shared UI in XAML (native controls are being generated, and business logic can be shared as well)

Xamarin vs Xamarin.Forms

The beauty of the first approach is ability to take advantage of Swift (iOS) or Java (Android) code samples, documentation, and community support. Swift/Java code can be easily translated into C#. In Xamarin.iOS app you have storyboards, ViewControllers and everything else you know from native iOS development. Similarly in Xamarin.Android – there are activities, fragments, action bars etc.

Xamarin.Forms on the other hand allows you to build apps faster. It’s very good fit for business applications.

Which approach should you choose? Ask StackOverflow.

Resources to get started

The great way to get started with Xamarin is Xamarin University. You can also find variety of Xamarin courses at Pluralsight. I especially recommend Building Your First Xamarin.iOS App from Start to StoreBuilding Your First Xamarin.Android App from Start to Store, and Introduction to Xamarin.Forms.

Friend of mine, James Montemagno (Developer Evangelist at Xamarin), runs video series Motz Codes Live where he explores different areas of Xamarin: from internals of MVVM, through Xamarin Inspector, to using Azure as backend for Xamarin mobile apps. You can also find a bunch of his videos from variety of conferences on youtube.

Additionally, there is a bunch of guides, recipes, and samples at Xamarin website. The official documentation is also a good source of knowledge.

Many of you were asking about Xamarin.Forms on reddit. A lot has been changed in this area as well. Check out the latest, greatest Xamarin.Forms update from James on .NET Rocks:

Code sharing strategies

One of the main advantages of Xamarin is code sharing. There are two ways to share code across platforms:

  • Portable Class Library (PCL) – produces separated .dll
  • Shared Project – compiled into one assembly with platform specific projects (you can think about files in shared projects as they all are present in all platform specific projects)

Most important differences:

  • PCL can have referenced libraries, while shared project cannot.
  • When we want to test shared code then in PCL case it is enough to reference PCL project only in the test project, while shared project requires additionally to add reference for all references that are being used by Shared Project.
  • You cannot have platform specific code in PCL, while shared project allows that using compiler directives.

You can learn more about code sharing here.

Two apps – two approaches

A few months ago I created two mobile apps with Xamarin, for 3 platforms (iOS, Android, UWP) and published them to 3 stores (App Store, Google Play, Windows Store):

  • Shopping Pad – smart shopping list that allows you not only to create a shopping list, but also remembers items that you have purchased in the past, how often they have been purchased, and based on that suggests items for your next grocery store trip.
  • Bread Crumbs – enables you to save your current location, and you can navigate to it later on (useful if you are in the new city, and you want to comeback to some place that you are “currently at”)

In Shopping Pad I used Portable Class Library to share code between platforms. In Bread Crumbs – Shared Project. I used SQLite for persistence in both apps, and the only difference I experienced was in creating SQLite connections. In PCL you need to create connection on “platform project” (you cannot do it from PCL). Shared Project allows you to use conditional compilation, and instantiate connection(s) in one file (using compiler directives).

I created unit tests (with xUnit) for Shopping Pad, and I was able to test entire app logic (for 3 platforms!) with only one test project. No platform specific code. Awesome!

Many times when I was looking for a solution to particular problem, I was able to reuse native iOS (Objective-C/Swift) or Android (Java) code samples, and translate them into C#.

Even for these two, small apps, shared code reuse was significant during development process. Especially in keeping consistency across platforms.

Both apps are available on App Store, Google Play, and Windows Store (Shopping Pad, Bread Crumbs).

Tips & Tricks

The struggle you may (and you probably will) experience at the beginning is platform setup. I recommend you to use Visual Studio simulators for Android (with Hyper-V) – they are faster. You need to have XCode installed on your Mac in order to run iOS apps built with Xamarin.

I develop Xamarin apps with Visual Studio on my ThinkPad X1, and use Mac only as host for running iOS apps. Some people run Windows on Mac with Parallels. Others use Xamarin Studio for iOS and Android, and switch to Windows only for UWP development. This will minimize the number of configuration issues, but will also give you worse development experience. I find Visual Studio much nicer for C#, and also for Xamarin development.

Xamarin – Windows Setup guide and Xamarin – Mac OS X Setup guide can help you get through configuration process. There is also fresh post from James about Setting Up Xamarin on Surface Book.

During mobile apps development with Xamarin you will encounter some problems that will not occur when developing pure native apps with Swift and Java. To save you some time, here are the list of a few of typical problems, together with solutions:

  • Problem: connecting with iOS host sometimes will not work. Solution: update your Mac (and XCode), update Xamarin plugin for Visual Studio, make sure your XCode path in Visual Studio settings is correct, and restart both machines. If it does not help check other solutions here.
  • Problem: iOS simulators not visible in Visual Studio. Solution: link.
  • Problem: Error: “Failed to add reference to ‘System.Collections’. Please make sure that it is in the Global Assembly Cache.”. Solution: add, manually, Droid/iOS dlls to references.
  • Problem: free provisioning Xamarin.iOS app. Solution: this guide.
  • Generic solution for many problems: restart Visual Studio (seriously, I’ve seen many StackOverflow questions where somebody was wondering why something does not work, and then “oh…after restarting Visual Studio it started working”).

One, not Xamarin specific tip: if want to have relations in SQLite database? Use SQLite-Net Extensions.

Publishing apps to stores

Android – bananas! Seconds for auto-validation, and ~3 hours to the store. I didn’t encounter any problems except copyrights for Bread Crumbs app icon, which I had to change. It was automatically detected! Impressive! This guide is more than enough to guide you through the process.

iOS – ~20 minutes for auto-validation, and ~4(!) days to the store. You can check current wait times here. Creating app bundle might be a little bit challenging. I was able to figure it out with Xamarin guide and this gist (I recommend option 2).

Windows Store – ~3h for auto-validation, and ~1 day to the store. I had my apps rejected, despite the fact that they were working on Windows machine, and on Windows Phone Device (Lumia 920). There were 2 issues:

  1. Referencing incorrect SQLite assembly: “SQLite for Universal App Platform” instead of “SQLite for Universal Windows Platform”.
  2. I didn’t test apps with with .NET Native (Project properties > Build > Compile with .NET Native Tool Chain), and one app was crashing during verification process. After debugging with .NET Native I was able to repro, diagnose and fix the problem.

Summary

Xamarin is not only sunshine and rainbows. You will have problems you wouldn’t when developing native apps, but also – you do not have some problems you would have when developing native apps. Check discussion about pros and cons of using Xamarin at Hacker News: Some thoughts after (almost) a year of real Xamarin use.

Be aware that there are also other cross-platform mobile frameworks, e.g., Apache CordovaReact Native, or NativeScript .

Since this year, Xamarin is free for Students, OSS projects and small teams (up to 5 people). You can use Visual Studio (including free Visual Studio Community Edition) or free Xamarin Studio Community Edition. That means – now you can use Xamarin for FREE!

Happy development!

Let me know in comments if you have any questions about developing apps with Xamarin!


.NET Rocks Podcast: Building the Azure Portal

.NET Rocks

I work on the new Azure Portal for almost two years now. Two months ago I gave a talk about this largest SPA in the World at NDC London.

In addition to my talk, I also gave an interview for .NET Rocks Podcast – Building the Azure Portal – where together with Carl and Richard we chat about different aspects of building, managing, and using this sophisticated web app:

Enjoy!


Agile Principles, Patterns, and Practices in C#

Agile Principles, Patterns, and Practices in C# (Robert Martin)

Agile Principles, Patterns, and Practices in C# by Uncle Bob is the best book about modern Software Development I have ever read.

First section (chapters 1-6) is an Overview of Agile, Extreme Programming (XP), and TDD. Very good introduction to modern software development. Chapter 6. shows all these techniques by example, by creating “The Bowling Game” application.

Section 2. is dedicated to SOLID principles, and UML diagrams. Former is described very succinctly, while latter is non-detailed overview of the most important parts with advises how to treat UML diagrams: not as documentation, but rather as a tool for explaining and expressing our thoughts to others (e.g. during the meetings on white board).

Section 3. and 4. is an overview (with examples and very good explanations) of design patterns, and case study of sample Payroll System application. In the case study, authors shows how to use TDD, UML, SOLID principles, and design patterns in the development process.

I really enjoyed this book. Even I knew most of the topics (UML, SOLID, design patterns), this book helped my to systematize my knowledge, and ensure that TDD is NOT dead.

I think this book should be required book for Software Engineering course at every college.

I strongly recommend this book. It is going to my favorite books list.


C# in Nutshell

C# 5.0 in a Nutshell: The Definitive Reference

C# 5.0 in a Nutshell is a great reference book about C#. Furthermore, it is worth to read it from the beginning to the end, to understand how C# works and to get familiar with the language features (can be used in the future as a reference). This book describes many features, which I have never used (after over 4 years programming in C#) like some XML serializers, COM interoperability or advanced threading/tasking techniques. Now, I know about them and where to look if needed.

This book is rather for experienced C# programmers. I do not recommend it as “first C# book”. It has a lot of examples, but the structure is rather encyclopedia style, than discovering the language from the basics. For beginner I would recommend Sams Teach Yourself Visual C# 2010 in 24 Hours.

C# in Nutshell has 1064 pages! Although it takes a while to read, it is worth your time if you think seriously about becoming good C# programmer. There are very detailed overviews and analysis of the language, supported by examples. If you do not want to spend time reading entire book, I recommend to use it as a reference and start learning about concrete feature, which you need at the time, from specific chapter in this book.

Why we read


Recommended Build 2014 sessions

build 2014

Finally, I had time to watch Build 2014 sessions. Here are the best I have seen.

Thinking for programmers (Leslie Lamport)

This session is intersection of Computer Science and programming. It will really makes you rethink your approach for solving problems and writing code. One of many interesting thoughts mentioned by Leslie Lamport was a role of specification. It is hard to disagree that in case of very complex code, need for change, after a few months or years, or by other programmer, will cause rewriting code for scratch if we do not have specification. I am recommending this session, because it is not demo of some new Microsoft tool/technology, but a solid piece of knowledge. It is not session for everybody, some may not like it. I love it!

Windows and the Internet of Things (Steve Teixeira)

This session is about writing Software for devices. But not only for PC, tablet or Phone. Also for embedded devices, or customized devices running on Windows Embedded. It is an overview of the future. Not only in Windows World, but at all. Steve Teixeira shows cool demos. E.g. controlling traffic lights using the Phone. He presents Intel Galileo, board which you can get for free by signing up! Only limited number available.

Building Azure Web Sites with Visual Studio Online “Monaco” (Chris Dias)

Visual Studio in Web Browser? I’m in! I am very impressed with progress which is being made in online version of Visual Studio. In addition to simple edits, there is a command line access, intellisense, git integration, side by side file comparison and more.

What’s New for ASP.NET and Web in Visual Studio 2013 Update 2 and Beyond (Scott Hanselman and Scott Hunter)

This is an update of ASP.NET features and future directions. Now, it really starts looking like LEGO pieces. If you are Web Developer, definitely worth to see.

Modern C++: What You Need to Know (Herb Sutter)

This talk is an overview of new features of C++. There is also 10-20 minutes about performance. Recommended if you are not familiar with new C++ features yet. For me, this session could be shorter, and some things could be skipped.

The Future of C# [and VB] (Dustin Campbel and Mads Torgersen)

First part (presented by Dustin Campbel) is about Roslyn. There is demo how custom code diagnostics can be created. Second part (presented by Mads Torgersen) is about new language features. My observation is that they started adding weird things to the language syntax. More over, Mads talk also about Visual Basic (for ~5 mins), which – as he claims – has a future as well. Mads already had similar session on other conferences (dotNetConf, NDC).

Go Mobile with C# and Xamarin (Miguel de Icaza)

Good introduction to Xamarin if you are not familiar with it. There is general overview and philosophy explained. There is also short demo. Good point to get started with Xamarin!

TypeScript (Anders Hejlsberg)

Anders Hejlsberg announced TypeScript 1.0. This session is an overview of TypeScript presented in a very solid way. Timestamped draft notes of the entire talk can be found here.

Developing Neural Networks Using Visual Studio (James McCaffrey)

This session is worth to see at least for first 8 minutes when James is summarizing entire build conference 🙂 The main content is good intro to Neural Networks. It awakened my desire to learn more about Artificial Intelligence and Machine Learning.

I’ve seen also: Building a Large Scale JavaScript Application in TypeScript (only slides, no code…), Building a Single Page Application with ASP.NET and AngularJS (I am not a fan of pasting large chunks of code during demos), Avoiding Cloud Fail: Learning from the Mistakes of Azure with Mark Russinovich (advanced, useful if you use Azure intensively), Building Modern Web Applications with Visual Studio and Web Essentials (just update in new Web Essentials features).