Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@ailen0ada

Xamarin.Mac フレームワークの歩き方

More than 5 years have passed since last update.

Xamarin Advent Calendar 2015 第24日目は,またもXamarin.Macの人しかわからないネタをお届けします。

Problem

Xamarin界隈ではフレームワークという言葉がたくさん出てきます。
本稿でのフレームワークは,動作環境としてのFrameworkです。
本当はUI Frameworkもやりたかった。。。

Target Framework

Xamarin.Mac ではターゲットフレームワークを3種から選択することができます。
TargetFrameworks
それぞれの特徴と,ハマりポイントをご紹介します。

tl;dr

これらは,

  • 利用できるAPI範囲
  • NuGet ターゲット解決の順序

に影響します。特に問題なければ,Mobile Frameworkにしましょう。
使える範囲は,Edit Referencesウィンドウで確認するのが手っ取り早いです。ここにすんなり出てきたら使えると。
EditReferences

Xamarin.Mac Mobile Framework

Mobileと銘打つとおり,iOS, Androidでの動作環境とほぼ同じです。
リンクできるのはこれを選択したときだけです。
System.ConfigurationSystem.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.

ふんふん。試してみましょう?
TypeLoadException
えっ?

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としてはサポートされてないライブラリが参照されてた場合はこんな感じにビルド時エラーが。
BuildError45.png

あとは,Xamarin.Mac .NET 4.5でサポートされていてもXamarin.Mac Mobileでサポートされていない場合は,ターゲットを変更したときにこんな表示が出ます。
AssemblyNotFound
NuGetパッケージ導入時も同様の表示が出るので,×表示が出たら何らか対策が必要な目安にはなります。

Unsupported Framework(s)

Xamarin.Mac .NET 4.5でも足りないアセンブリを参照するときにはこれを使うことになります。つまりフルのMonoを使って動作させることができます。
ただしXamarin社が公式にサポートしないと明言しているため,サポートに泣きつくことはできなくなります。
当然リンクも動作しません。NuGetもnet45優先で解決されます。

Conclusion

これから作るならできるだけMobile Frameworkで。
それ以外は混乱のもとなのでできるだけ使わないほうがいいです。
NuGet パッケージを作られる方。できれば Xamarin.iOS20+Xamarin.Mac20とでもして,ご配慮いただけますと幸いです。

5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ailen0ada
Xamarin.Mac の人です。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?