Xamarinの仕組み ( 超簡単バージョン )

336件のシェア(そこそこ話題の記事)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

下記のページでは、Xamarinが異常に早いことをレポートしています。

Mobile App Performance Redux

001 002

テストの内容によって色々あるとは思いますが、Xamarin.iOSが、Objective-Cより早く、Xamarin.AndroidがJava Androidとほぼ互角と言うのは、正直すごいグラフだと思いました。

少なくとも、XamarinがObjective-CやJavaのコードを吐いているわけでは無いことだけは直ぐに分かります。

今回は、Xamarinが、どういう仕組みでiOSやAndroid上で動作しているかを可能な限り簡単に紹介したいと思います。

っと、偉そーに言ってますが、実は、これちゃんとした公式の資料を基づくものでなく、私が勝手に解釈している内容ですので、専門家からのツッコミを得て完成するエントリーと意味で投稿させて下さい。

[2016.04.13 修正] 本記事は、皆様に色々教えて頂き、逐次修正しております。どうかご了承下さい。

2 PInvoke

PInvokeとは、プラットフォーム呼び出しサービスの事です。 PInvokeを使用すると、DLLに実装されているアンマネージ関数(Win32など)をマネージコード(.NET)から呼び出すことができます。

.NETは、それ以前のWin32をラップする形で利用できますが、.NETで提供されていない機能や外部のライブラリを使用する場合、直接呼び出す事になります。そしてその方法が、PInvokeです。

C#がまだ出始め(.Net2.0など)の頃は、.NETで提供されるライブラリも非常に貧弱で、プログラムを書くとPInvokeだらけだった事が懐かしいです。

003

3 Xamarin

そして、XamarinもPInvokeの仕組みで、各プラトフォームのネイティブな機能を呼び出してします。そしてC#というインターフェースで開発者に提供する際に、iOSのUIKitや、Androidのフレームワークなどの名前に綺麗に合わせているので、それぞれのフレームワークの拡張のような錯覚に陥るのですが、ちょっと違います。

004

図は、私が勝手に書いた概念図なのですが、Xamarin.AndroidもXamarin.iOSもJavaやObjective-Cに関係なく存在しています。

4 実行

次に実行環境なのですが、まず、Androidにおいては、JavaVMは、使われていません。独自のMonoVMを実機にインストールして動作しています。そのため、吐いているバイナリはMSILです。

また、iOSでは、実機用のバイナリは、MonoランタイムでARM命令に変換しています。 なお、この変換は、すべて実行前に行われるために、幾つかの制約があることに注意が必要です。 また、最適化も行われて予想外に必要なオブジェクトが削られたりすることもあるようです。

参考:AOTの罠: Xamarin.Forms の ListView で System.MissingMethodException: Default constructor not found for type

005

5 最後に

最近、Microsoftになって、一部無料で開放されたこともあり、非常に人気が出ているXamarinですが、その仕組みを簡単に説明した資料はなかなか見つかりません。

最初にも書きましたが、今回、「Xamarinの超簡単な仕組みの説明」に挑戦してみました。図も、私が勝手に理解しているものを描いたものです。是非、ツッコミをお願いします。

[2016.04.13] 現時点で、頂いてるレスポンスを紹介させて下さい。

007

今、私の間違を、詳しく教えていただいているところです。 判明次第。本記事に反映させて頂きます。

6 参考資料


インサイドXamarin
この辺でXamarin導入による 効果と限界をしっかり把握してみよう MVP Community Camp 2015
AOTの罠: Xamarin.Forms の ListView で System.MissingMethodException: Default constructor not found for type