Windows Phone 8.1 と Xamarin.iOS/Android で PCL を使う方法

moonmile/XamarinXmlSerialize なところの説明を少し。手元のシリアライザ練習用に作ったものですが、ついでにユニバーサルアプリにを追加して Xamarin.iOS/Android から PCL を参照させてみました。

image

こんな風な、ソリューションの構成になっているところで

image

こんな風な PCL を作ります。普通に作ると Windows Phone 8.1 と Xamarin.iOS/Android の両方はチェックできないのですが、いずれ「できる」だろうってことで先取りします。

方法は簡単です。以前やってみた PCL のターゲットフレームワークに Xamarin をインストールせずに Xamarin.Android を追加する | Moonmile Solutions Blog の方法を使います。PCL の参照設定の「.NET」を選択してプロパティウィンドウを見ると、パスが出てきます。

image

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile111

このパスをエクスプローラーで開いて、SupportedFrameworks フォルダに Xamarin.iOS.xml と Xamarin.Android.xml をコピーするだけです。この2つのファイルは Profile7 あたりにあります。Profile111 は、今回の VS2013 Update 2 RC でできたフォルダで、まだ Xamarin.iOS/Android が対応していないだけ(と思われる)です。将来的には対応されるでしょう。

image

そうすると、Xamarin.iOS/Android から PCL を参照できるようになるので、Windows Phone 8.1 とも共有が可能です。

先のサンプルでは、もう少し手を入れていて、Shared フォルダに BasicMain.xaml のコードビハインドを分離させています。

image

こんな風に、partial にしておいて、ボタンイベントだけをこっちの共有プロジェクトに書き出します。Windows ストアと Windows Phone の xaml には、「Click=”ClickLoad”」のようにイベントを設定するので、複数のビューとコードビハイドがうまく分離できますね、という方法です。考えてみたら、ファイルのリンクの追加でもできた話なのですが、まあ共有プロジェクトのほうが効果的かと。

image

で、共有プロジェクトは現在、Windows ストアと Windows Phone にしか出てきませんが、ユニバーサルアプリで使っているSharedプロジェクトをXamarin.iOSで使う | Moonmile Solutions Blog な方法を使うと、Xamarin.iOS/Android からも使えます。これも先行きは Xamarin で対応されるでしょう。となると、メソッド名と引数の並びが同じであればいいわけで、うまくやると、iOS の Storyboard と Android の axml と共有できるかもしれません(MvvmCross でもうまくいくかも)。

Android の場合は、「void ClickLoad(object sender, EventArgs e)」となるので引数の型が EventArgs の型だけ異なります。iOS の場合は IBAction の関係から「partial void clickCalc(MonoTouch.Foundation.NSObject sender)」となるので、引数の型が全く違います。まあ、#if ディレクティブで区切ればいいのですが、いちいち #if で分岐させるのも面倒ですよね。C/C++ ならば #define マクロで逃れるところですが、C# だとそれもできない。VB6 の頃のようにボタンクリックイベントから、別のクラスあるいはCOMを逐一呼び出すよう名な形にはしたくない。このあたりはちょっと考えどころ。

カテゴリー: WinRT, Xamarin パーマリンク