更新: Xamarin Studio のアルファ チャネルを使用している場合、Windows から PCL をコピーする必要はなくなりました。v4.0、Profile158 を使用できます。これは、非同期でもすぐに使用できます。
更新: PCL で async を機能させる方法については、この記事のXamarin Studio Mac、ポータブル クラス ライブラリ、Async および Androidに追加したので、PCL で async を使用する場合は、この記事の後に移動してください。
MacでMvvm + PCL + Xamarin Studioを機能させるために必要だった問題に対する一種の実用的な解決策。詳細は以下をご覧ください。
以下の手順は、Android および PCL プロジェクトで機能するようにします。iOS プロジェクトの場合、Mac 上の Xamarin Studio は、MonoTouch,Version=v1.0 の TargetFramework を Nuget に通信しています。mvvm パッケージには +MonoTouch40 が含まれているため、Nuget はプロジェクトへのパッケージのインストールを拒否します。回避策は追加することです
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
.csproj に Nuget を使用してパッケージを追加し、TargetFrameworkVersion を v1.0 に戻します。
Visual Studio で動作を確認しました。TargetFramework MonoTouch,Version=v4.0 のプロジェクトが Nuget プラグインに報告されます。これが、Xamarin Studio Mac ではなく Visual Studio で同じパッケージが機能する理由です。これは一貫性があるように修正する必要があると思います。
手順
Xamarin スタジオ
- Mac の Xamarin Studio で Beta または Alpha チャネルを使用してください。
- Nuget パッケージ マネージャーをインストールします: Xamarin Studio / アドイン マネージャー
.NETPortable を Mono.Framework にインストールする
- .NETPortable (C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETPortable) フォルダーを Windows PC から Mac にコピーします。
- /Library/Frameworks/Mono.framework/External/xbuild-frameworks/.NETPortable/ の下に配置します (これが Xamarin Studio に同梱されている場合に備えて、既存のフォルダーを上書きしないようにしてください!!!) (こちらも参照)
パッチ ナゲット
パッチが適用されたフォークは、 https ://nuget.codeplex.com/SourceControl/network/forks/takoyakich/nuget/latest で見つけることができます。2.7 ブランチを使用してください。自分にパッチを当てたい場合:
git clone https://git01.codeplex.com/nuget
cd nuget
git checkout -b 2.7 origin/2.7
patch -p1 < {patch file saved from below}
cd src/Core
xbuild
cp bin/Debug/NuGet.Core.dll ~/Library/Application\ Support/XamarinStudio-4.0/LocalInstall/Addins/MonoDevelop.PackageManagement.0.6/NuGet.Core.dll
Xamarin Studio を開いたままにしている場合は、再起動します。
試して!
- Xamarin Studio を開く
- 新しいポータブル ライブラリを作成する
- プロジェクトで、オプション、ビルド/一般に移動すると、ターゲット フレームワークを選択できるダイアログが表示されます (たとえば、.net45+wp8 は Profile49 に対応します)。
- 参照への移動、Nuget パッケージの管理、Mvvmcross の追加
- ここから@slodge の優れた n+1 mvvmcrossチュートリアル ビデオの1 つに従ってください ...
Nuget.Core.dll へのパッチ:
diff --git a/src/Core/NETPortable/NetPortableProfileTable.cs b/src/Core/NETPortable/NetPortableProfileTable.cs
index 6f6a9ff..edc710c 100644
--- a/src/Core/NETPortable/NetPortableProfileTable.cs
+++ b/src/Core/NETPortable/NetPortableProfileTable.cs
@@ -49,16 +49,12 @@ namespace NuGet
private static NetPortableProfileCollection BuildPortableProfileCollection()
{
var profileCollection = new NetPortableProfileCollection();
- string portableRootDirectory =
- Path.Combine(
- Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86, Environment.SpecialFolderOption.DoNotVerify),
- @"Reference Assemblies\Microsoft\Framework\.NETPortable");
-
+ string portableRootDirectory = GetPortableRootDirectory ();
if (Directory.Exists(portableRootDirectory))
{
foreach (string versionDir in Directory.EnumerateDirectories(portableRootDirectory, "v*", SearchOption.TopDirectoryOnly))
{
- string profileFilesPath = versionDir + @"\Profile\";
+ string profileFilesPath = Path.Combine(versionDir,"Profile");
profileCollection.AddRange(LoadProfilesFromFramework(profileFilesPath));
}
}
@@ -66,6 +62,22 @@ namespace NuGet
return profileCollection;
}
+ private static string GetPortableRootDirectory()
+ {
+ if (IsMonoOnMac ()) {
+ return "/Library/Frameworks/Mono.framework/External/xbuild-frameworks/.NETPortable";
+ }
+ return Path.Combine(
+ Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86, Environment.SpecialFolderOption.DoNotVerify),
+ @"Reference Assemblies\Microsoft\Framework\.NETPortable");
+ }
+
+ static bool IsMonoOnMac ()
+ {
+ // Environment.OSVersion.Platform returns UNIX, didn't find a better way :-(
+ return File.Exists ("/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder");
+ }
+
private static IEnumerable<NetPortableProfile> LoadProfilesFromFramework(string profileFilesPath)
{
if (Directory.Exists(profileFilesPath))