Xamarin Advent Calendar 2015 第24日目は,またもXamarin.Macの人しかわからないネタをお届けします。
##Problem
Xamarin界隈ではフレームワークという言葉がたくさん出てきます。
本稿でのフレームワークは,動作環境としてのFrameworkです。
本当はUI Frameworkもやりたかった。。。
##Target Framework
Xamarin.Mac ではターゲットフレームワークを3種から選択することができます。
それぞれの特徴と,ハマりポイントをご紹介します。
###tl;dr
これらは,
- 利用できるAPI範囲
- NuGet ターゲット解決の順序
に影響します。特に問題なければ,Mobile Frameworkにしましょう。
使える範囲は,Edit Referencesウィンドウで確認するのが手っ取り早いです。ここにすんなり出てきたら使えると。
###Xamarin.Mac Mobile Framework
Mobileと銘打つとおり,iOS, Androidでの動作環境とほぼ同じです。
リンクできるのはこれを選択したときだけです。
System.Configuration
,System.ServiceProcess
といったまあいわゆる,そんなに使われていないだろうもの,モバイル環境で使わないであろうものはばっさりと切られています。
ただしXamarin.Macにおいては空実装のSystem.Configuration
名前空間とそのAPIが残されている,らしいです。
NOTE: An empty, stubbed-out version of the System.Configuration API has been included in Xamarin.Mac to avoid breaking some 3rd-party PCL files. So while the namespace is included, it is non-functional and should never be used in a Xamarin.Mac project.
NuGetパッケージは下記の順に参照解決されます。
Xamarin.Mac20 > Xamarin.Mac10 > portable-net45
いずれもパッケージ内にない場合は,パッケージのインストールに失敗します。
つまりnet45
しかない場合はインストールに失敗します。
###Xamarin.Mac .NET 4.5 Framework
ほとんどMobile Frameworkと同一です。ただほとんどのBCLを参照することができます(あくまでサブセットです)。
これと引き替えに,リンカーによる最適化は使えなくなります。
だいたいのNuGetパッケージ,サードパーティ製品を動作させることを目的としたフレームワークです,と明言されています。
含まれているアセンブリはSupported Assembliesを参照してください。
NuGetパッケージはnet45
が優先されます。
従って,このフレームワークにも含まれないアセンブリを参照している場合 -- たとえばSystem.Web
とかSystem.Drawing
とか -- は,当然実行できません。
これらの参照を解除しても動作するライブラリに関しては動作させることができます。
Mono
としてはサポートしているけどXamarin.Mac .NET 4.5
としてはサポートされてないライブラリが参照されてた場合はこんな感じにビルド時エラーが。
あとは,Xamarin.Mac .NET 4.5
でサポートされていてもXamarin.Mac Mobile
でサポートされていない場合は,ターゲットを変更したときにこんな表示が出ます。
NuGetパッケージ導入時も同様の表示が出るので,×表示が出たら何らか対策が必要な目安にはなります。
###Unsupported Framework(s)
Xamarin.Mac .NET 4.5でも足りないアセンブリを参照するときにはこれを使うことになります。つまりフルのMonoを使って動作させることができます。
ただしXamarin社が公式にサポートしないと明言しているため,サポートに泣きつくことはできなくなります。
当然リンクも動作しません。NuGetもnet45
優先で解決されます。
##Conclusion
これから作るならできるだけMobile Framework
で。
それ以外は混乱のもとなのでできるだけ使わないほうがいいです。
NuGet パッケージを作られる方。できれば Xamarin.iOS20+Xamarin.Mac20
とでもして,ご配慮いただけますと幸いです。