LoginSignup
7
7

More than 5 years have passed since last update.

Xamarin StudioのPCL選択時にNugetからライブラリインストールできない場合の対処法

Posted at

Xamarin Studioも最近はPCLにも対応して、MvvmCross等もNuget一発でインストールできるようになっている…はずなのですが、なぜかうちの環境ではそれがうまくいかず、PCL環境でのNugetでのインストールが失敗しまくってて困っていました。
ちゃんと、Profile78を指定しているにも関わらず、失敗しまくるのです。
が、その原因が判り、解決もできましたので、同じ悩みを抱えている人のために報告します。

まず、同じ現象かどうかの見分け方です。
以下に、同じPCL環境でインストールできないエラーでも、本当にPCLに対応してなくて出てくるエラーと、異常発生時に出てくるエラーの差を載せておきます。

正しいプロファイルが読めている時のインストールエラー
Could not install package 'DotSpatial.Projections 1.6.0.0'. You are trying to install this package into a project that targets 'portable-net45+wp80+win+MonoAndroid10+MonoTouch10', but the package does not contain any assembly references or content files that are compatible with that framework. For more information, contact the package author.
おかしい環境でのインストールエラー
Could not install package 'DotSpatial.Projections 1.6.0.0'. You are trying to install this package into a project that targets 'portable-Profile78', but the package does not contain any assembly references or content files that are compatible with that framework. For more information, contact the package author.

差がわかりますでしょうか?
正しい環境では、プロファイルの環境が「portable-net45+wp80+win+MonoAndroid10+MonoTouch10」と具体的に出てきていますね。
でも、おかしな環境では、「portable-Profile78」等と表示され、ちゃんとした環境情報が出て来ない。
これ、指定したプロファイルがちゃんとインストールされてないと見なされてるために起こる現象らしいのです。
StackOverflowで教えていただきました。

…とはいえ、プロファイルのインストールフォルダであるはずの

/Library/Frameworks/Mono.framework/Versions/3.2.6/lib/mono/4.5/../xbuild-frameworks/.NETPortable

にはちゃんと種々のプロファイルは入ってるし、設定画面でPCLのプロファイル選択画面にも出てくるし、プロファイルがインストールされてないなんてあるわけないじゃん、と思いつつ、Stackoverflowで答えてくださった方が自作された、プロファイルの読み込み状況を表示するツールを実行してみました。
すると…

異常な状態でのプロファイル読み込み状況表示
Possible .NETPortable root paths:
/Library/Frameworks/Mono.framework/External/xbuild-frameworks/.NETPortable
/Library/Frameworks/Mono.framework/Versions/3.2.6/lib/mono/4.5/../xbuild-frameworks/.NETPortable

.NETPortable root path found: /Library/Frameworks/Mono.framework/External/xbuild-frameworks/.NETPortable

.NETPortable profiles:
Loaded assembly: /Library/Frameworks/Mono.framework/Versions/3.2.6/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll [External]
Loaded assembly: /Library/Frameworks/Mono.framework/Versions/3.2.6/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll [External]
Profile1 net40+win+sl40+wp+Xbox40
Profile104 net45+win+sl40+wp71
Profile131 net403+win+sl40+wp+Xbox40
Profile14 net40+sl50
Profile18 net403+sl40
Profile19 net403+sl50
Profile2 net40+win+sl40+wp
Profile23 net45+sl40
Profile24 net45+sl50
Profile3 net40+sl40
Profile36 net40+win+sl40
Profile37 net40+win+sl50
Profile4 net45+win+sl40+wp
Profile41 net403+win+sl40
Profile42 net403+win+sl50
Profile46 net45+win+sl40
Profile47 net45+win+sl50
Profile5 net40+win
Profile6 net403+win
Profile88 net40+win+sl40+wp71
Profile95 net403+win+sl40+wp
Profile96 net403+win+sl40+wp71
Profile7 net45+win

うおっ!?正しいプロファイル保存場所

/Library/Frameworks/Mono.framework/Versions/3.2.6/lib/mono/4.5/../xbuild-frameworks/.NETPortable

の他に以下のよくわからないプロファイル保存場所

/Library/Frameworks/Mono.framework/External/xbuild-frameworks/.NETPortable

もできていて、しかもそっちがルートパスになってる!
そして、見事にWindows系のプロファイルしか読み込まれてない!

この謎プロファイル保存場所ができた理由はよく判りません。
が、とりあえず読み込ませないために、

おかしなプロファイルをないないする
$ cd /Library/Frameworks/Mono.framework/External/xbuild-frameworks
$ sudo mv .NETPortable .NETPortable_bak

ディレクトリリネーム等して存在を消し、Xamarin Studioを再起動してみました。
そして、同じプロファイルチェックプログラムを走らせてみると…。

読み込まれるようになった後のプロファイル状況表示
Possible .NETPortable root paths:
/Library/Frameworks/Mono.framework/External/xbuild-frameworks/.NETPortable
/Library/Frameworks/Mono.framework/Versions/3.2.6/lib/mono/4.5/../xbuild-frameworks/.NETPortable

.NETPortable root path found: /Library/Frameworks/Mono.framework/Versions/3.2.6/lib/mono/4.5/../xbuild-frameworks/.NETPortable

.NETPortable profiles:
Loaded assembly: /Library/Frameworks/Mono.framework/Versions/3.2.6/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll [External]
Loaded assembly: /Library/Frameworks/Mono.framework/Versions/3.2.6/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll [External]
Profile136 net40+sl50+wp80+win+MonoAndroid10+MonoTouch10
Profile14 net40+sl50+MonoAndroid10+MonoTouch10
Profile147 net403+sl50+wp80+win+MonoAndroid10+MonoTouch10
Profile158 net45+sl50+wp80+win+MonoAndroid10+MonoTouch10
Profile19 net403+sl50+MonoAndroid10+MonoTouch10
Profile24 net45+sl50+MonoAndroid10+MonoTouch10
Profile37 net40+sl50+win+MonoAndroid10+MonoTouch10
Profile42 net403+sl50+win+MonoAndroid10+MonoTouch10
Profile47 net45+sl50+win+MonoAndroid10+MonoTouch10
Profile5 net40+win+MonoAndroid10+MonoTouch10
Profile6 net403+win+MonoAndroid10+MonoTouch10
Profile49 net45+wp80+MonoAndroid10+MonoTouch10
Profile7 net45+win+MonoAndroid10+MonoTouch10
Profile78 net45+wp80+win+MonoAndroid10+MonoTouch10

おおお、ちゃんとXamarin iOS/Android系を含んだプロファイルが読み込まれてますよ!
PCLプロジェクトつけてNuget実行しても、ちゃんと読み込まれるようになりました!

その旨StackOverflowで報告した所、謎のプロファイル保存場所をリネームするような乱暴な方法ではなく、パスの設定切り替え等で行う方法も教えていただきましたが、とりあえず私は今の所、そちらは試していません。
もしディレクトリリネームなんてそんな、と抵抗のある方は、リンク先の教えていただいた方の方法を試されるとよいと思います。

結局、なぜこの状況になってしまったのか、その理由は判らずじまいなのですが、状況の把握方法と解決方法は判ったので、同じ悩みに悩んでおられる方の助けになればと思い、共有させていただきます。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7