Even though Xamarin is becoming a popular platform, many open source .NET libraries are simply not up to speed with supporting Xamarin.iOS
and Xamarin.Android
. However, in these cases, you are definitely not out of luck. Often, if there is a Silverlight or Windows Phone version of the library, you can simply create an iOS or Android class library and add the files with no code changes.
To help with this process, Xamarin has created an online service tool to scan your existing code and determine how far off a library is from being portable. Navigate to http://scan.xamarin.com and upload any *.exe
or *.dll
file to have its methods analyzed for cross-platform development. After the scanning process, you'll get a report of the porting percentage (how much your component / application is portable to all platforms: Android, iOS, Windows Phone, and Windows Store).
The following screenshot is a sample report of the Lucene .NET client library:
If the library is running a high percentage on portability, you should have a relatively easy time porting it to Android or iOS. In most cases, it can even be easier to port the library to Xamarin than Windows Phone or WinRT.
To illustrate this process, let's port an open source project that doesn't have Xamarin or a portable class library support. I have selected a dependency injection library called Ninject due to its usefulness and relationship to ninjas. You can find out more about the library at http://www.ninject.org.
Let's begin setting up the library to work with Xamarin projects as follows:
Ninject.sln
in Xamarin Studio.Ninject.iOS
.Ninject
main project. Make sure you use the Add Existing Folder dialog to speed up this process.If you aren't familiar with GitHub, I recommend that you download the desktop client for Mac found at http://mac.github.com.
Now try to build the Ninject.iOS
project; you will get several compiler errors in a file named DynamicMethodFactory.cs
, as shown in the following screenshot:
Open DynamicMethodFactory.cs
and notice the following code at the top of the file:
#if !NO_LCG #region Using Directivesusing System; using System.Reflection; using System.Reflection.Emit; using Ninject.Components; #endregion /// *** File contents here *** #endif
It is not possible to use System.Reflection.Emit
on iOS due to Apple's platform restrictions. Luckily, the library writers have created a preprocessor directive called NO_LCG
(which stands for Lightweight Code Generation) to allow the library to run on platforms that do not support System.Reflection.Emit
.
To fix our iOS project, open the project options and navigate to the Build | Compiler section. Add NO_LCG
to the Define Symbols field for both Debug and Release in the Configuration drop-down menu. Click on OK to save your changes. Notice how the entire file is now highlighted with a light gray color in Xamarin Studio, as shown in the following screenshot. This means that the code will be omitted from being compiled.
If you compile the project now, it will be completed successfully and a Ninject.iOS.dll
file will be created, which you can reference from any Xamarin.iOS
project. You can also reference the Ninject.iOS
project directly instead of using the *.dll
file.
At this point, you might wish to repeat the process to create a Xamarin.Android
class library project. Luckily, Xamarin.Android
supports System.Reflection.Emit
, so you can skip adding the additional preprocessor directive if you wish.
3.138.204.186