Xamarinは、iPhoneやAndroid等のスマートフォンアプリをc#言語で開発するためのライブラリ(有料)、及びそれを提供する会社名です。
クロスプラットフォームの開発を目指しており、製品としては以下があります。

  • Xamarin.iOS
  • Xamarin.Android
  • Xamarin.Mac


また、Xamarinとは違いますが、c#を使用する事から以下の端末も同じ言語で開発できます。

  • Windows Phone


ライセンスの種類と価格は以下の通りです(初年度)。
正直、Businessライセンス以上を使わないと結構不便だったりします。
また、初年度よりは安いですが、毎年更新が必要です。
https://store.xamarin.com/

ライセンス価格説明
STARTER 無料 基本的な挙動を確認できる無料版。
シミュレータや実機確認まで可能ですが、機能やサイズに制限があるので主に勉強用でしょうか。
INDIE $299 個人で使用する場合に必要な最小のバージョン。
使用できない機能がいくつかあります。(SQL Client、WCF等)
Business $999 個人で使用する場合でも推奨されるバージョン。
Visual Studioでの開発(一部制限あり)や、.NET Frameworkの機能をフルに使用できます。
Enterprise $1899 企業での開発で必要となるバージョン。
サポートや使用者数に主眼を置かれたライセンスです。


正直、かなり高いですね…
これ、使う理由があるのでしょうか?
iPhoneやAndroidの開発を行おうとした場合、以下の言語での開発が必要となります。
これらで開発すれば、開発ツールで必要となる金額は無料です。

  • iPhone:Objective-C
  • Android:Java


どちらの言語も、動くものを作れるという意味では問題なく使用できます。
ただ、開発効率、品質、及びWeb開発を含めて考えると、使用したいとは思いません。

そこで、c#言語で開発が可能となるXamarinの出番となります。
元々、Microsoft .NETをWindows環境以外で動作させるためにMonoと呼ばれるライブラリの開発が行われています。
これを、iPhoneやAndroidの開発で使えるようにしたのがXamarin(旧称:MonoTouch)です。

Xamarinを使用すると、スマートフォン、Web等の開発を「全てc#言語に統一」できます。

Xamarinを選ぶ理由

かなり高額な製品あるにも関わらず、私がこれを使用するのはこんな理由からです。

開発効率の向上

アプリ開発は基本的にアイデア勝負になります。(私が良いアイデアを出せてるかは別ですが…)
だからと言って、開発規模(機能)がショボいアプリを作っても意味がありません。
ある程度の開発規模を確保するためには開発効率は命とも言える要素となります。
Xamarinでの開発は、c#での開発が可能であるため、Objective-Cとは比較にならない開発効率が出せます。

品質の確保

個人的な考えですが、Objective-Cの最大の問題は品質の確保が難しい点にあります。
特に、メモリリーク対策が大変で、完全に防ぐのは不可能ではないかとさえ思えます。
まあ、iOS5でAutomatic Reference Countingと呼ばれる自動メモリ管理の仕組みが追加されたので、状況が少しは変わるかもしれませんが。
Xamarinでは、メモリ管理は自動化されるし、テストもある程度自動化可能だし、非常にありがたいです。

バージョンアップが頻繁

iPhoneやAndroidで利用可能となった新機能がすぐに使えるようになります。
これはありがたいです。

実機転送までなら無料

シミュレータの開発に加え、実機での簡単な確認だけなら無料で使用できます。
このため、一通り作り終わって、ある程度動くようになった時点で購入した方が良いと思います。
ただ、思った以上に起動時間のチューニングで問題を引き起こすため有料版での最適化が必須となります。

Xamarinを選ばない理由

Xamarinを気に入っている私ですが、以下の不満(欠点)があります。
徐々に改善されてきてはいますが、これらが問題になる場合、使わない選択肢もあると思います。

  • iPhoneとAndroidのクロスプラットフォーム開発で、GUIに互換性がない
  • .NETと完全互換ではない(特に、特定の国や言語に依存する機能は動作しない場合が多い)
  • ドキュメントが整備されていない(特にAPIリファレンス)
  • 開発元が海外で、品質がMicrosoft .NETより低い
  • APIデザインがイケてない(オリジナルAPI構造に引きずられている)
  • バイナリサイズが大きくなる(最近は問題にならないか?)
  • オーバヘッドがある(Objective-CやJavaで作るより少し遅い)
  • Objective-Cのライブラリの利用が難しい(利用する方法はあるのですが、かなり大変)
  • 用途を限定した場合は、高次元フレームワークほど開発効率が出ない