PCL のターゲットフレームワークに Xamarin をインストールせずに Xamarin.Android を追加する

からの一連のところの話と、明後日発表をするので、ちょっと気になったので PCL の作りを再チェックしてました。

image

Xamarin拡張を入れると、ポータブルクラスライブラリを作るときに、Xamarin.Android と Xamarin.iOS のチェックを入れられるようになるんですが、これって何処で設定しているんでしょうね?という疑問です。

そもそも、ポータブルクラスライブラリ自体は「ポータブル」なんだから、他の特殊なアセンブリを参照する必要はないんですよね。最低限のアセンブリを使うわけだから。だから、Xamarin.Androidなどのインストールをしなくても、何等かの設定で読み込めるわけで、この設定自体は何処かにあったのか…それとも Xamarin.Androidをインストールしたときか?という推測が成り立ちます。

PCLのプロジェクトをエディタで開くと、

<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile78</TargetFrameworkProfile>

となって TargetFrameworkProfile が「Profile78」になっています。これが何処にあるかというと、C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETPortable/v4.5/Profile/ フォルダの中にあるんですね。更に、SupportedFrameworks フォルダを調べると、Xamarin.Android などがあります。

image

フォルダ名は、

  • Profile7
  • Profile49
  • Profile78

と3つある訳ですが、これが何を意味するのかは他の SupportedFrameworks フォルダを覗くと分かります。

Profile7 Profile49 Profile78
.NET Framework 4.5
Windows Store apps (Windows 8).
Windows Phone 8
Xamarin.Android
Xamarin.iOS

どうやら先のチェックボックスと対応しているようです。RedistList フォルダの中には、対応するアセンブリのリストがあるので、その差分を取ってみると。

Profile7 Profile49 Profile78
Microsoft.VisualBasic
System.Threading.Tasks.Parallel
System.Reflection.Emit.ILGeneration

だいたい、こんな感じになってます。で、このProfileフォルダは Xamarin を入れたときに出来るのではなくて、最初に Visual Studio を入れたときに作られます。つまり、あらかじめ PCL となるアセンブリの組み合わせは決まっているということですね。となると、動的コード生成で使われる System.Reflection.Emit.ILGeneration は Windows ストアアプリにときに入らない、ってことになります。

このあたり、Xamarin.iOS では動的コード生成ができないという制限があるのですが、そもそもが WinRT の場合は動的コード生成ができないので、PCL にするとそもそも動的コード生成はできないってことですよ。これはMSDNにもあります。

と、今気が付いたんですが、そうなると Profile49 の Xamarin.iOS の設定って間違っているんじゃないか?と思ったり。

■Xamarin.Android を入れずに、PCL の設定で Xamarin.Android を表示するには

ってことで、ややこしいですが、

Xamarin.Android.xml

<?xml version="1.0" encoding="utf-8"?>
<Framework DisplayName="Xamarin.Android" Identifier="MonoAndroid" Profile="*" MinimumVersion="1.0" MaximumVersion="*" />

Xamarin.iOS.xml

<?xml version="1.0" encoding="utf-8"?>
<Framework DisplayName="Xamarin.iOS" Identifier="MonoTouch" Profile="*" MinimumVersion="1.0" MaximumVersion="*" />

を、対応する Profile フォルダに保存すれば OK です。Xamarin Studio をインストールしなくてもxml ファイルを作るだけです。Visual Studioを再起動すると設定が反映されます。

こんな風に OreOre.Framework を PCL に追加することもできますね。意味ないけど。

image

カテゴリー: Xamarin パーマリンク