Visual Studio 2013 Update で追加された「ユニバーサルアプリ」で、
Universal Windows appを見てみた – かずきのBlog@hatena
http://okazuki.hatenablog.com/entry/2014/04/03/220347
この中に「*.Shared」というプロジェクトがあります。このプロジェクトは何をやっているかというと、手っ取り早く言えばファイルをリンクで共有しているだけかなと。であれば、ユニバーサルアプリだけでなくて、Xamarin.iOSやXamarin.Androidとか、他のプロジェクトでも使えるはずで、ちょっと試してみます。
コード共有のプロジェクトは通常のプロジェクトの追加では出てきません。ならば、「ファイル」→「テンプレートのエクスポート」で自作してみれば?と思ったのですが、これを作ってもプロジェクトの追加では出てきません。これが、RC2 だからなのか、先行き追加されるのか解りませんが…仕方がないので *.csporj ファイルを編集します。
- ユニバーサルアプリのプロジェクトを作成する。
- *.Shared.csproj をコピーして、自作のプロジェクトファイルを作る。
ここではプロジェクトの名前を「AppShare.Shared」にしておきます。
- AppShare.Shared.projitmes にリネームする。
SharedGUID をユニークになるように変更する。
- AppShare.Shared.csproj に以下の行を追加する。
<Import Project="AppShare.Shared.projitems" Label="Shared" />
- ソリューションエクスプローラーで、AppShare.Shared.csproj を追加する。
- 参照するプロジェクト(AppShare.ioS.csproj など)に以下の行を追加する。
「参照設定」から追加できないので、これも直接書き換えます。
<Import Project="..\AppShare.Shared\AppShare.Shared.projitems" Label="Shared" />
うまく追加できると、次の図のように共有コードのプロジェクトが参照できる状態になります。
このプロジェクトはファイル共有しているだけなので、コードだけじゃなくてコントロールなども置けますね。書き方によれば、partial class も置けるし、インターフェースなしで本体を参照する dack コードも書けます。いわゆる、プロジェクトにファイルを追加するときに「リンクとして追加」と同じ機能になると思います。なので、各プロジェクトのシンボル(プラグマ)が使えるということで、切り替えは #if を使えば OK。
チープですが、共有コードに、ShareClass を作っておいて、
using System; using System.Collections.Generic; using System.Text; namespace AppShare.Shared { class ShareClass { public int Add( int x, int y ) { return x + y; } } }
AppShare.Androidプロジェクトのほうでコードを書きます。
void button_Click(object sender, EventArgs e) { var edit1 = FindViewById<EditText>(Resource.Id.editText1); var edit2 = FindViewById<EditText>(Resource.Id.editText2); var text1 = FindViewById<TextView>(Resource.Id.textView1); int x = int.Parse(edit1.Text); int y = int.Parse(edit2.Text); var obj = new Shared.ShareClass(); int ans = obj.Add(x, y); text1.Text = ans.ToString(); }
AppShare.iOSでも同じ感じで。
partial void clickCalc(MonoTouch.Foundation.NSObject sender) { int x = int.Parse(text1.Text); int y = int.Parse(text2.Text); var obj = new Shared.ShareClass(); int ans = obj.Add(x, y); lable1.Text = ans.ToString(); }
サンプルコードはこちらから http://1drv.ms/1jbhVNq
ちなみに、Xamarin StudioでAndroidのほうはビルドできるのですが、Xamarin Studio for Mac で iOSのほうはビルドができませんでした。Visual Studio限定の技かも。