Xamarin(ザマリン) とはなんぞや

【2017年9月時点の情報で更新しました。】

Xamarin(ザマリンと読みます) とはなんぞや、個人開発者として使う時にどうなるの、的な事をさらっと書いてみようと思います。

Xamarin は 2016年2月、Microsoft に買収され、 Visual Studio に無償で同梱されることになりました。

* [【速報】Xamarin のこれからについて！ - Xamarin 日本語情報](http://ytabuchi.hatenablog.com/entry/ms-xamarin)
* [Xamarin が Microsoft に買収された結果 - Qiita](http://qiita.com/amay077/items/6e5c40abe0c21fc79e6a)

Xamarin 自体は元企業名であり、その歴史は .NET の Linux 版を開発していた Ximian という企業が Novell に買収されて、その後レイオフされて作った企業で・・・した。
このあたりの歴史については [@atsushieno さん](http://atsushieno.hatenablog.com/entry/2013/12/24/213950) や [ちょまどさん](https://blogs.msdn.microsoft.com/chomado/xamarin/xamarin-history-as-a-company/) のブログが（読み物としても）おもしろいです。
Microsoftに買収されたことにより企業としての Xamarin はなくなりますが、現在のところ Xamarin という開発ツールの名称は、Visual Studio や、Xamarin Studio の中に見ることができます。

* [Xamarin - Official site](http://xamarin.com/)
* [Xamarin - Wikipedia](http://ja.wikipedia.org/wiki/Xamarin)

で、同社が開発した、 .NET技術で iOS や Android アプリが作成できる SDK が、Xamarin.iOS だったり、Xamarin.Android だったりするわけですが、それらに Mac アプリを開発できる Xamarin.Mac や、Xamarin Studio という統合開発環境を加えたツール群をまるごとひっくるめて Xamarin と呼んでいます。
（Xamarin社は他にも、クラウド上で実機テストができる [Xamarin Test Cloud](https://www.xamarin.com/test-cloud), C#のPlaygroundツール[Xamarin Workbooks](https://developer.xamarin.com/guides/cross-platform/workbooks/) などのプロダクトがあります）

## 作成できるアプリケーション

開発ツールの Xamarin を利用して作成できるアプリは、まず以下のものがあります。

* Mono を利用したアプリケーション、クラスライブラリ
* iOSアプリ(Xamarin.iOS)
* Androidアプリ(Xamarin.Android)
* macOSアプリ(Xamarin.Mac)
* 複数のプラットフォームで再利用可能なクラスライブラリ(.NET Standard または PCL)

さらに、 Xamarin.Forms というフレームワークによって、以下のアプリも作成可能です。

* Windows(UWP) アプリ
* Tizenアプリ（※開発中）
* Linuxアプリ（※開発中）

Windows 用の .NETアプリ(Windows.Forms や WPF)は、Xamarin 自体では作成できません。それは Visual Studio の役割です。ただ、.NET Standard(または PCL)と呼ばれる、プラットフォームを問わず動作するアセンブリ(DLL) を作成できますし、そもそも Mono と .NET の API はほとんど同じなので、書いたコードは Windows でも流用できます。

## どこが共通化できる？

まず、Xamarin.Android, Xamarin.iOS, Xamarin.Mac が提供するのは、

**各プラットフォーム(PF)版の.NET API ＋ 各PFのAPIの.NETラッパクラス**

です。

「各PF版の.NET API」とは、いわゆる基本クラスで、基本的な型だったり、文字列処理だったり LINQ だったりその他もろもろです。

一方、「各PFのAPIの.NETラッパクラス」とは、Android なら Android SDK、iOS なら CocoaTouch の API を .NET で記述できるラッパーです。ここにプラットフォーム間の互換性はありません。

なので、画面を作るのに Xamarin.Android なら ``Activity`` クラスを使いますし、Xamarin.iOS なら ``ViewController`` クラスを使います。
GPS を使うのに、.Android なら ``LocationManager`` を使いますし、.iOS なら ``CLLocationManager`` を使います。

つまり、共通にできるのは「コア」な部分だけで、「画面」と「各PF固有の機能」は共通化することができません。従って、各プラットフォーム の API は理解しておく必要があります。それから .NET Framework の基本クラスライブラリも。

上司に言うと「なんだその程度か」と返されると思いますが、コア部分だけでも、 **Javaと Swift でそれぞれ実装しなくて良い** というのは十分に価値があると思うんですよね僕は。

* [XamarinでWindows / Mac OSX 両対応のデスクトップアプリを作る](http://qiita.com/okajima/items/8ca53ff00a825f28dbc6)

は、異なるプラットフォームで共通化できる箇所が具体的に示された有益な情報です。

ほかのクロスプラットフォーム開発可能な SDK（Titanium とか Abobe AIR とか）との比較はこちら → かきました : [Xamarin vs 他のクロスプラットフォーム開発ツール](http://qiita.com/amay077/items/01917ef1be3da9259348)

## 画面まで共通化できる [Xamarin.Forms](https://www.xamarin.com/forms) 

これはいわゆる Titanium Mobile や Adobe Air, Delphi XE, 最近では React Native と同じアプローチで、共通の画面定義体から、各種プラットフォーム（Android, iOS, Windows Phone, UWP<Universal Windows Platform >）向けの画面を生成します。Adobe Air, Delphi XE と異なるのは、それぞれのプラットフォームが提供するUIパーツが使用されるという点です。
画面定義体は XAML（ザムル, WPF のそれとは違います）か C＃ のコードで記述します。他にも ValueConverter, バインディング可能なプロパティなど .NET アプリ開発者に馴染みのある要素を使って開発できます。
XAML のグラフィカルなエディタはないので手書きするしかありませんが、[XAML Previewer for Xamarin.Forms](https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-previewer/)や、[Gorilla Player](http://gorillaplayer.com/)を使って、リアルタイムにプレビューさせることができます。

このXamarin.Formsフレームワークの活用は広がりを見せていて、以下のものに対応（または目下対応中）します。

* Android
* iOS
* UWP
* macOS ※ver3.0で対応予定
* Tizen ※ver3.0で対応予定
* Windows(WPF) ※ver3.0で対応予定
* Linux(GTK#) ※ver3.0で対応予定

2016年11月に、[TizenがXamarin.Forms対応プラットフォームに加わると発表された事](http://nakasho-dev.hatenablog.jp/entry/2016/11/18/030310)は、ちょっとした驚きとともに迎え入れられました。今後は Xamarin.Forms 3.0 で Tizen の他に macOS、そしてなんと WPF や GTK# を使った Linux アプリ開発にも対応する予定です（[Unity での実装だ・・・と！？](https://twitter.com/migueldeicaza/status/909507003894177792)）。

Xamarin.Formsは発展途上でも何でもありません。**実戦投入できるフレームワーク** です。
複数プラットフォームで辻褄を合わせて共通なインターフェースとして公開しなければならないので、提供されるUIコントロールは少ないですが、Xamarin.Android, Xamarin.iOS の上に成り立っているので、 **ネイティブの部品をXamarin.Forms化することは容易** です。なぜならネイティブのAPIも同じ言語で同じIDEを使って開発・デバッグできるからです(例えば React Native では、AndroidネイティブのAPIをJavaScript側にブリッジする箇所は Java で**書か**なければなりません)。

## .NET製のライブラリを Java や Swift から呼び出せるようにする Embeddinator-4000

これまで、 XamarinでJava製のライブラリを使うことはできるが、その逆、つまり **「C#で作成したライブラリを Java-Android や Swift-iOS から呼び出すこと」** はできませんでした。

が、その常識が覆されます。

[Embeddinator-4000](https://github.com/mono/Embeddinator-4000) は、 .NETで作成したライブラリをJavaやSwiftなど他のプラットフォーム＋言語から呼び出せるようにするための仕組みです。詳しくは開発者の資料を見てください。

* [Embeddinator-4000から学ぶXamarinの基礎 // Speaker Deck](https://speakerdeck.com/atsushieno/embeddinator-4000karaxue-buxamarinfalseji-chu)

Embeddinator-4000は、絶賛開発中のツールで実用はまだまだ先になりそうですが、近い将来、クロスプラットフォームアプリ開発の重要な選択肢のひとつになると思います。

## Macの人は Visual Studio for Mac、Win の人は Visual Studio で開発しますよ

Mac 向けの Visual Studio、[Visual Studio for Mac](https://www.visualstudio.com/ja/vs/visual-studio-mac/) がリリースされました。
中身は実質 Xamarin Studio で、 Windows版の Visual Studio の機能がすべて搭載されているわけではありません。
Xamarin Studio は Visual Studio for Mac とほぼ同じ機能を搭載していますが、起動時に「Visual Studioを使ってね☆」と案内されるなど、もはや敢えて選択する意味はなくなってきています。

Windows の場合、Visual Studio 2017 に同梱されるようになり、また無料化されたため、 Visual Studio Community でも利用できるようになりました。
(これまで提供されてきた Windows版の Xamarin Studio は、提供終了となりました。)
Visual Studio 2015 でも使用可能ですが、環境構築でハマることが多いので Visual Studio 2017 を推奨します。Visual Studio 2017 では、Xamarin のインストールが簡単になっています。それでも既定の選択だとかなりの容量が必要なので、次のリンクを参考に、定義オプションを外すとよいでしょう。

* [Xamarin やりたい人向け Visual Studio 2017 インストール手引書 - Xamarin 日本語情報](http://ytabuchi.hatenablog.com/entry/visualstudio2017)
* [Xamarin の為だけに Visual Studio 2017 をミニマムインストールする - Qiita](http://qiita.com/amay077/items/43cd700e4d125a6517b7)

Visual Studio 2015 と Visual Studio 2017 は共存が可能です。

その他の開発ツールには [JetBrains Rider](https://www.jetbrains.com/rider/) があります。また開発中の製品ですが、現時点でも開発に使用することができます。

* [JetBrains Rider で Xamarin.Android プロジェクトのデバッグが行えるようになりました - Qiita](http://qiita.com/amay077/items/c22f608c5ec4c2e39d88)

また iOS アプリを開発する場合は、ビルドや実行・デバッグのために Mac が必要なので、現実的には Mac 必須です。これは買収された後も変わっていません。
Remoted iOS Simulator (for Windows) が搭載され、Windows の画面でアプリを実行することができるようになりましたが、iOS アプリのビルドには Mac がどうしても必要になります。

## だからiOSアプリを作るならMacは必要なんだってば！

[Xamarin Live Player](https://www.xamarin.com/live) が発表されて、次のような日本語記事が公開されています。

* [WindowsでiOSアプリを開発、テスト、公開できる――MicrosoftがXamarin Live Playerを発表 | TechCrunch Japan](http://jp.techcrunch.com/2017/05/12/20170511microsoft-now-lets-ios-developers-deploy-run-and-test-their-apps-directly-from-windows/)
* [iOSアプリ開発でMac OSが不要に、Windowsで開発・テスト・実機配備可能な「Xamarin Live Player」 -INTERNET Watch](http://internet.watch.impress.co.jp/docs/news/1059302.html) ※タイトル修正されたようです :thumbsup: 

が、 「macOS不要でiOSアプリが **公開** できる」というのは間違い（誤訳）です。
Xamarin Live Player(XLP)の実行形式は、

* [Xamarin Live Playerの仕組みを想像してた - ぴーさんログ](http://ticktack.hatenablog.jp/entry/2017/05/13/022611)

で解説されているとおり、XLP用のiOSアプリがソースコードをインタープリタ形式で実行しているに過ぎません。つまり、実際のアプリが動作しているわけではなく、アプリを配布・公開するには、これまで通りmacOSでビルドする必要があります。あと [これ](https://twitter.com/amay077/status/862838700568334336)。

## Xamarin のコアライブラリはオープンソースになりました

Xamarin の基盤となっている [Mono](http://www.mono-project.com/) は元々オープンソースです。

Xamarin.Android, Xamarin.iOS, Xamarin.Mac, Xamarin.Forms のこれまでプロプライエタリだったライブラリ群は、いずれもMITライセンスによるオープンソースになりました → [Xamarin Open Source SDK](http://open.xamarin.com/)

Xamarin Studio の IDE としての機能は元々オープンソースである MonoDevelop なので、純粋な Mono アプリケーションを作成するのにも使用されます。Xamarin Studio の Xamarin固有のプラグイン部は、オープンソース化されないとのことです。つまり、Microsoftとしては「開発ツールが収益源」ということになります。

## 価格

Xamarin自体は無償になりましたが、企業利用の場合、大抵は Visual Studio の購入が必要になります。

### 個人の場合

Windowsの人は、[Visual Studio Community](https://www.visualstudio.com/ja-jp/products/visual-studio-community-vs.aspx) で開発・配布ができるようになりました。
Macの人は、Visual Studio for Mac で（もちろん [Xamarin Studio](https://www.xamarin.com/studio) でも） 開発・配布ができるようになりました。

### 企業の場合

Windowsの人は、Visual Studio のサブスクリプションの購入が必要です。
Macの人は、Visual Studio for Mac で開発を行いますが、Windowsと同様、Visual Studio サブスクリプションの購入が必要です。

詳しくは、 [Xamarin の開発環境を整理しよう - Xamarin 日本語情報](http://ytabuchi.hatenablog.com/entry/2016/04/02/163106) を参考に、あるいは Microsoft へ問い合わせてください。

[@nuits_jp](https://twitter.com/nuits_jp) さんが「絶対わかるXamarinライセンスの判断方法」を書いてくれました！

* [絶対わかるXamarinライセンスの判断方法 - nuits.jp blog](http://nuits.hatenadiary.jp/entry/2016/07/11/231323)

## 日本語情報について

2017年9月現在、Xamarin の日本語情報、書籍もだいぶ増えてきましたね。

### 書籍(商業出版:発売日が新しい順)

#### [Xamarinプログラミング入門 C#によるiOS、Androidアプリケーション開発の基本 (マイクロソフト関連書)](http://amazon.jp/dp/4822253503/?tag=oku2008-22) ※10/5発売予定

2014年に発売された [C#によるiOS、Android、Windowsアプリケーション開発入門](https://www.amazon.co.jp/dp/B00MN5P6PY/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1) を基に最新情報で刷新した書籍。2014年当時には存在していなかった
 Xamarin.Forms にも触れています。

#### [Xamarinネイティブによるモバイルアプリ開発 C#によるAndroid/iOS UI制御の基礎](http://amazon.jp/dp/4798149810/?tag=oku2008-22)

Xamarin.Android、Xamarin.iOS の ”Xamarinネイティブ” にフィーチャーした本。 Xamarin.Forms を扱うには、Xamarinネイティブの理解は必須なので、この本から読むと「急がば回れ」にならずにすむかも知れません。

#### [Essential Xamarin ネイティブからクロスプラットフォームまで モバイル.NETの世界 (技術書典シリーズ(NextPublishing))](http://amazon.jp/dp/4844397915/?tag=oku2008-22)

技術書典2で頒布した Essential Xamarin Yin/Yang（後述） が、なんとインプレスR&Dより商業本として発売されました！ 同人版に比べて最新情報での加筆修正、Xamarin.iOS入門の章が追加されています。

#### [基礎から学ぶ Xamarinプログラミング](https://www.amazon.co.jp/gp/product/4863542240?tag=oku2008-22)

開発環境の構築やC#のポイントも解説し、Xamari.iOS、Xamari.Android、Xamarin.Formsに加え、XAMLやMVVMでの開発手法も解説しています

#### [プログラミングXamarin 上 Xamarin.FormsとC#によるクロスプラットフォームモバイルアプリ開発](http://amzn.to/2pEHd38)

ついに登場、Xamarin.Formsのバイブル「[ペゾルド本](https://developer.xamarin.com/guides/xamarin-forms/creating-mobile-apps-xamarin-forms/)」の日本語訳書籍、@atsushieno さんが [XamarinFormsBookReading](https://xamarinformsbookreading.connpass.com/) で巡回されてるやつですね。下巻も期待！

#### [Xamarinエキスパート養成読本 (Software Design plus)](http://amzn.to/2nExEQ0)

「エキスパートになる」というよりは、「初心者の人がとりあえずXamarin.Formsでアプリを作れるようになる」ところまでが書かれています。

#### [Xamarinではじめるスマホアプリ開発](http://amzn.to/2nEBKrD)

こちらも初心者向け。Visual Studio for Mac が使われていてどちらかというとiOSアプリ寄りの解説がされています。

#### [C#によるiOS、Android、Windowsアプリケーション開発入門](http://www.amazon.co.jp/dp/B00MN5P6PY/?tag=oku2008-22)

内容は少し古いですが、基礎の理解には問題ありません。

#### [.NET開発テクノロジ入門2016年版 Visual Studio 2015対応版](http://www.amazon.co.jp/dp/4822298612/?tag=oku2008-22)

.NET開発全般についての書籍ですが、Xamarinについての章があります。C＃/.NET自体もこれから勉強するという方にはふさわしいでしょう。

### 書籍(個人または同人出版:発売日が新しい順)

**※これら以外にも Xamarin について(一部でも)書かれた個人／同人出版本がありましたらお知らせください**

#### [Essential Xamarin Yin/Yang (陰/陽)](https://atsushieno.github.io/xamaritans/tbf2.html)

@atsushieno さん主宰のサークル「Xamaritans(6名、私も参加しております)」が執筆したXamarin技術誌です。
陰(Yin) と 陽(Yang) の２冊となっており、[技術書典2](https://techbookfest.org/event/tbf02)、[超技術書典](https://techbookfest.org/event/cho01) で販売しました。
現在は [Boothにて製本版またはダウンロード版を購入](https://xamaritans.booth.pm/) できます。
また、[加筆や最新の情報で更新された商業本化](http://atsushieno.hatenablog.com/entry/2017/05/17/234629) が進行中です、ご期待下さい！

#### [かずきのXamarin.Forms入門（Kindle版)](http://amzn.to/2l7oQNK)

元MVPで現Microsoftの中の人 @okazuki さんによる自費出版本です。Xamarin.Formsの日本語での入門にはピッタリです。
そしてなんと同内容のものが Slideshare で無料配布されております！ありがたい！

* [Xamarin.forms入門(Slideshare版)](https://www.slideshare.net/okazuki0130/xamarinforms-70553057)

### Webサイト、ブログ

* [ものがたり](http://atsushieno.hatenablog.com/) - Xamarin の中の人である [@atsushieno](https://twitter.com/atsushieno) 氏のブログ
* [ちょ窓帳 – 千代田まどか(ちょまど)のブログ](https://blogs.msdn.microsoft.com/chomado/) - Microsoftエバンジェリストのちょまどさんのブログ
* [Xamarin 日本語情報](http://ytabuchi.hatenablog.com/) - Xamarinコミュニティ(JXUG)主宰の @ytabuchi さんのブログです。
* [Xamarin逆引きTips - Build Insider](http://www.buildinsider.net/mobile/xamarintips) - Xamarinに関するTipsが集まっています
* [Qiita の "Xamarin" タグ](http://qiita.com/tags/xamarin/items)
* [Experiments Never Fail](http://blog.amay077.net/) - ワタシのブログです😅
* [teratail の "Xamarin" タグ](https://teratail.com/questions/search?q=Xamarin) - 分からない事はここで聞いてみると大抵回答があります

### コミュニティ

* [Japan Xamarin User Group (JXUG)](http://jxug.org/) - @ytabuchi さんが代表と務められているコミュニティ。定期的に勉強会、ハンズオンなどを開いています。
* [JXUG - connpass](https://jxug.connpass.com/) - 登録しておくとXamarinのハンズオンや勉強会の通知を受け取れます

Microsoft に買収され、より多くの人に知ってもらえ、使ってもらえるようになった Xamarin、事実上クロスプラットフォーム開発の最良の選択肢になったと言えますね。

## 最後に注意点

Visual Studio ＋ Xamarin はクロスプラットフォームアプリ開発が行える非常に強力な開発ツールですが、Android や iOS のアプリ開発の知識は **必須** です。特に開発中に期待通りに動作しない事象が発生した場合、基本であるネイティブに立ち返って調べる必要があります(トラブルシューティングの方法を「[Xamarin を使用したアプリ開発での、問題解決の方法](http://qiita.com/amay077/items/abb872c3650f65f09b8f)」に書きました)。

また、Visual Studio は最強のIDEであるのはその通りですが、Androidアプリ開発には Android Studio、iOSアプリ開発にはXcodeという公式な開発ツールがあり、それらの方が便利な機能もあります。

そのため、Android Studio や Xcode で Android、iOSアプリを開発できるようになった上で、Visual Studio+Xamarin でクロスプラットフォーム開発をするのが、最大の効果を得られる方法です。

**Java も Swift も学んで C# で D.R.Y(Don't Repeat Yourself) するのが Xamarin です**