そういえばXamarinも含めたいかもり、どうやるのかしらん。
— neuecc (@neuecc) 2014, 3月 17
からの一連のところの話と、明後日発表をするので、ちょっと気になったので PCL の作りを再チェックしてました。
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 などがあります。
フォルダ名は、
- 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 に追加することもできますね。意味ないけど。