読者です 読者をやめる 読者になる 読者になる

連載のおまけ: モバイル・フレームワークにデスクトップAPIを「取り戻す」

mono

Xamarinの話を書くはずなのに未だにモバイル製品の話が一向に出てこない某連載なのですが、今回ちょっと検証する時間がとれなくて削ったネタを書いておきます。まさかのLinq to SQLです。以下、最後の段落に続くはずだったネタとして見て下さい。

--

前述の通り、モバイル環境で利用できるAPIが少ないのは、「Silverlightに含まれていなかったから」であり、自前でビルド出来るものは、自分で追加することができる。その意味で、既にソースコードが揃っているmonoのクラスライブラリは、再利用性が高い。


たとえば、MonoのLinq to SQLの実装は、内部的にはDbLinqと呼ばれる外部プロジェクトを取り込んでおり、このプロジェクトはSQL Server専用だったはずの同APIに、さまざまなデータベースのプロバイダーAPIを実装しており、本家Linq to SQLよりもはるかに汎用性が高く、SQLiteもサポートしている。(ただし、monoのビルドでは、MONO_STRICTというオプションが設定されており、SqlClient以外のデータ・プロバイダーは除外されてしまう。)

monoを`--with-monodroid=yes`でconfigureしてビルドした後、`mcs/class/System.Data.Linq`ディレクトリに移動して`make PROFILE=monodroid`を実行すると、(2013年末の時点では)2つだけ、Consoleに色を設定しようとするコードだけがビルドエラーとなる。これを`#if !MONODROID`のようにコメントアウトすると、ビルドは通り、Android用のSystem.Data.Linq.dllが出来てしまう。(ちなみにLinq to SQLはExpression Treeを使用するので、iOSでは動作しないだろう。)

もちろん、これはたまたまLinq to SQLの依存ライブラリが少なく、依存関係も小さかったから実現したのであって、多くのアセンブリではこのテクニックは通用しない。ASP.NETなどは到底不可能だろう。

Xamarin StudioやVisual Studioのプロジェクトとして新規作成して、そこにソースコードを追加しても良いだろう。この場合は、各アセンブリのディレクトリにある`{アセンブリ名}.dll.sources`というファイルの各行を読み取って、<Compile Include='...' /> という内容に変換した上で、プロジェクトの.csprojファイルに追加するハックがお手軽だ。(ちなみにSystem.Data.Linq.dllでは`MONO_STRICT`をビルド時に定義していないと失敗する。)