以前より懸案だった、OSS になった Xamarin.Forms を弄ろうと思ってコードを DL してざっと目を通しているところ。
xamarin/Xamarin.Forms: Xamarin.Forms official home
https://github.com/xamarin/xamarin.forms
たくさんのプロジェクトがあるが、肝なところは、
- Xamarin.Forms.Platform
- Xamarin.Forms.Core
- Xamarin.Forms.Pages
- Xamarin.Forms.Xaml
- Xamarin.Forms.Build.Tasks
- Xamarin.Forms.Xaml.Xamlc
- Xamarin.Forms.Xaml.Xamlg
なところですかね。
Xamarin.Forms をビルドする
Makefile があるが、Windows 上では動きません。Linux 上でビルドします。
- Ubuntu に github からダウンロードして
- Install Mono on Linux | Mono を参照にインストール
- mono-devel
- mono-complete
- referenceassemblies-pcl … これがないと、/usr/lib/mono/xbuild-frameworks/ が空かも。
- あとは、make すれば ok. *.dll は 各プロジェクトの bin/Release 等の下にできるので、あとでかき集める?
1 2 3 4 5 6 | $ ls -la /usr/lib/mono/xbuild-frameworks/ total 16 drwxr-xr-x 4 root root 4096 Sep 13 01:19 . drwxr-xr-x 16 root root 4096 Aug 29 02:26 .. drwxr-xr-x 11 root root 4096 Aug 29 02:20 .NETFramework drwxr-xr-x 5 root root 4096 Sep 13 01:20 .NETPortable |
ビルド時に PCL を参照するのですが、先頭が . になっているので ls –a を付けないと確認できないという罠があります。
あとは、出来上がった *.dll を Xamarin.Forms プロジェクトのものと差し替えてやればいいんじゃないかな。たぶん、ローカルの nuget フォルダーを作って、そこから適当なバージョンでダウンロードできるようにするとよいでしょう。
Xamarin.Forms.Xaml.Xamlg が *.g.cs を作成する
いくつか見ていくと、結構面白いものがみつかります。XAML を使うと、コードビハインドの対象として、*.g.cs ファイルが作られます。XAML で書かれていた x:Class とか x:Name とかは、このコードに変換されるんですよね。でもって、これが C# なゆえに、F# の XAML が使えなくてタイププロバイダーで XAML を作ったりするんですが、F# のビルド時の DLL と Xamarin で実行するときの DLL が異なるからうまくいかない、という変な状態に陥っている訳ですが(この変な状態は、以前調査したときよりも分かるようになったので、別の機会に解説を)、ならば、*.g.fs を出力するようにすればよいわけです。そうすると、Xamarin.Forms の XAML に対してコードビハインドの F# コードを作るようにできるので、XAML を扱う F# が書けますよね。まあ、現状の F# の場合は PCL の問題があって構成がややこしくなるので、.NET Core 版の Xamarin が出て来たときにもうちょっと突っ込んだほうがいい気もしますが。
ちなみに、以前つくていた、moonmile/XFormsPreviewer は、動的に XAML をロードして、XAML のタグから直接 x:Name をバインドする方法なので、タイププロバイダーともコードビハインドの *.g.cs 方式とも違います。このあたりは、状況にあわせていろいろな方法があったほういいので。
でもって、もう少し、Xamarin.Forms.Xaml.Xamlg を眺めてみて、F# コードにコンバートできるか試してみますか。というところ。