PCL対応のTypeProviderを作…れるのかな?の巻

Xamarin.Forms の TypeProvider を作ろうとしたが断念したの巻 | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6104

の続きです。FSharp.Data だと PCL で動いているよん、という話と。 @Reed Copsey, Jr. さんが独自だけど Xamarin.Forms も動いたよ(まだ変なバグで修正中だそうですが)とうことで、週末に FSharp.Data のアプローチを見ていきました。

逃れる手段としては、

f# – FS2024 Static linking error when PCL project use by TypeProvider – Stack Overflow
http://stackoverflow.com/questions/25175031/fs2024-static-linking-error-when-pcl-project-use-by-typeprovider/25194727#25194727

な風にリフレクションを使えばいいのだけど、そもそも Native のライブラリを Android に直接持っていくのも変な話だし、危うい点があるので、できることならば PCL で持っていきたい。そこで、FSharp.Data の XmlProvider のところをちまちまと読み込んだところ、なるほど、

  • TypeProvider でビルドしているときは、Native で動かす。
  • 作成した Type を動かすときは、それぞれの Profile に従う。

という構造になっています。こんな風に、FSharp.Data.DesignTime と FSharp.Data.Profile47 を分けます。DesingTime のほうはフルセットが入っているバージョンで、Visual Studio を使って TypeProvider するときに使うものです。Profile47 のほうは、実行時に呼び出されるもので、それぞれのプロファイルでプロジェクトを作ります。

image

実行時に使う法は。FSharp.Data.dll という名前に統一しておいて、対応する FSharp.Core は動的に読み込むという仕組みですね。なるほど、確かにこれで動きそうです。FSharp.Core の動的読み込みは、AssemblyResolver.fs に書いてあるので、Profile78 と Profile259 を追加します。この2つは、Visual F# Tools で使われるプロファイルで、Profile78 が Xamarin.iOS/Android で使われる PCL になります。プロジェクト自体は、こんな感じで追加されています。

 image

でもって、Profile47 と似た感じで作っては見たのですが、何故かコンソールで動かすと、追加情報:メソッドが見つかりません: ‘Void System.IO.StringReader..ctor(System.String)’ なエラーを吐きます。非常に不思議です。さらに不思議なのは、TypeProvider で作った文字列をそのまま使う場合には出なくて、何か加工しようとすると出るエラーです。

image

また、XmlProvider にある Parse メソッドを使おうとすると、以下のようなエラーが出ます。これも不思議です。

image

このエラーは、Profile47 の場合はでなくて、もともとの FSharp.Data にある Profile7 の場合も出ます。何か変な感じで PCL のロードをしているような気もするのですが、たぶん原因は AssemblyResolver.fs にあるような気がしています。System.IO.StringReader が無いことはないので、対応する System のロードが間違っている感じ。

ひとまず、以下のアプローチをすれば PCL 内で TypeProvider を使えるようになるらしい。

  • TypeProvider のデザイン時の DLL を分けて、動的ロードできるようにする。
  • 実行時のアセンブリは実行環境のプロファイルに合わせて、デザイン時には、DesignTime を動的に読み込む。
  • ビルド時の FSharp.Core は、プロファイルに合わせて動的読み込み?
  • ビルド時に必要なアセンブリは動的読み込みしている? > AssemblyResolver.fs の referencedAssembliesPairs これが足りないような気がする。

実験コードは、こちら
https://github.com/moonmile/FSharp.Data.PCL

カテゴリー: F# パーマリンク

PCL対応のTypeProviderを作…れるのかな?の巻 への1件のコメント

  1. ピンバック: F# Weekly #33, 2014 | Sergey Tihon's Blog

コメントは停止中です。