2012-04-28 7 views
9

How can I build a targetting pack for Portable Class Libraries?に続き、http://jpobst.blogspot.com/2012/04/mono-for-android-portable-libraries-in.htmlのアドバイスでは、私はポータブルクラスライブラリを使用したいくつかのモノドロイドサンプルプログラムをビルドすることができました。MonoDroidでSystem.Netを参照するポータブルクラスライブラリを使用できますか?

しかし、私の入力PCLのどれかがSystem.Netアセンブリを参照すると、Monodroidは自分のapkをパッケージ化できません。なぜなら、System.Net.dllのファイルが見つからないためです。

私が理解しているように(http://docs.xamarin.com/android/about/assemblies)、MonoDroidはSystem.dll内のすべてのSystem.Net機能をバンドルしています。

System.Netを参照するこれらのPCLをMonoDroidで使用する方法はありますか?

  • MonodroidパッケージャにこのSystem.net->システムリダイレクションを理解させる方法はありますか?
  • または、モノドイドの参照だけを「訂正」するための実行可能な事前パッケージステップがありますか?
  • その他の提案はありますか?

技術的な情報と更新:

パッケージングプロセスが現在のレベルで失敗している:

"C:\Projects\Misc\MVVMCROSS\Sample - Tutorial\Tutorial\Tutorial.UI.Droid\Tutorial.UI.Droid.csproj" (SignAndroidPackage target) (1) -> 
(_ResolveAssemblies target) -> 
    C:\Program Files (x86)\MSBuild\Novell\Novell.MonoDroid.Common.targets(441,2): error : Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'System.Net, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'. Perhaps it doesn't exist in the Mono for Android profile? [C:\Projects\Misc\MVVMCROSS\Sample - Tutorial\Tutorial\Tutorial.UI.Droid\Tutorial.UI.Droid.csproj] 
C:\Program Files (x86)\MSBuild\Novell\Novell.MonoDroid.Common.targets(441,2): error : File name: 'System.Net.dll' [C:\Projects\Misc\MVVMCROSS\Sample - Tutorial\Tutorial\Tutorial.UI.Droid\Tutorial.UI.Droid.csproj] 
C:\Program Files (x86)\MSBuild\Novell\Novell.MonoDroid.Common.targets(441,2): error : at Monodroid.Tuner.MonoDroidResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters) [C:\Projects\Misc\MVVMCROSS\Sample - Tutorial\Tutorial\Tutorial.UI.Droid\Tutorial.UI.Droid.csproj] 
C:\Program Files (x86)\MSBuild\Novell\Novell.MonoDroid.Common.targets(441,2): error : at Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(List`1 assemblies, AssemblyDefinition assembly) [C:\Projects\Misc\MVVMCROSS\Sample - Tutorial\Tutorial\Tutorial.UI.Droid\Tutorial.UI.Droid.csproj] 
C:\Program Files (x86)\MSBuild\Novell\Novell.MonoDroid.Common.targets(441,2): error : at Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(List`1 assemblies, AssemblyDefinition assembly) [C:\Projects\Misc\MVVMCROSS\Sample - Tutorial\Tutorial\Tutorial.UI.Droid\Tutorial.UI.Droid.csproj] 
C:\Program Files (x86)\MSBuild\Novell\Novell.MonoDroid.Common.targets(441,2): error : at Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(List`1 assemblies, AssemblyDefinition assembly) [C:\Projects\Misc\MVVMCROSS\Sample - Tutorial\Tutorial\Tutorial.UI.Droid\Tutorial.UI.Droid.csproj] 
C:\Program Files (x86)\MSBuild\Novell\Novell.MonoDroid.Common.targets(441,2): error : at Xamarin.Android.Tasks.ResolveAssemblies.Execute() [C:\Projects\Misc\MVVMCROSS\Sample - Tutorial\Tutorial\Tutorial.UI.Droid\Tutorial.UI.Droid.csproj] 

これは、のMSBuildタスク内で発生している:

<!-- Find all the assemblies this app requires --> 
<ResolveAssemblies 
    Assemblies="$(ProjectDir)$(OutDir)$(TargetFileName);@(ReferencePath)" 
    I18nAssemblies="$(MandroidI18n)" 
    LinkMode="$(AndroidLinkMode)" 
    ReferenceAssembliesDirectory="$(TargetFrameworkDirectory)"> 
     <Output TaskParameter="ResolvedAssemblies" ItemName="ResolvedAssemblies" /> 
    <Output TaskParameter="ResolvedUserAssemblies" ItemName="ResolvedUserAssemblies" /> 
    <Output TaskParameter="ResolvedFrameworkAssemblies" ItemName="ResolvedFrameworkAssemblies" /> 
    <Output TaskParameter="ResolvedSymbols" ItemName="ResolvedSymbols" /> 
    </ResolveAssemblies> 

からのインポート:

<UsingTask TaskName="Xamarin.Android.Tasks.ResolveAssemblies" AssemblyFile="Novell.MonoDroid.Build.Tasks.dll" /> 

答えて

3

可能な解決策(MonoDroidが型転送をサポートしていると仮定)は、関連する型をSystem.dllに転送するSystem.Net.dllアセンブリを持つことです。

完全な.NET Frameworkでは、System.Netの型がSystem.dllにあり、.NET 4.0.3または4.5のSystem.Net.dllを見ると、これらの型にはTypeForwardedToAttributesが表示されますこれにより、ポータブルライブラリのSystem.Net.dllへの型参照がSystem.dllにリダイレクトされます。 Jeremy Liknessのブログ投稿シリーズUnderstanding Portable Librariesには、これがどのように機能するかについて詳しく説明されています。

ポータブルライブラリ内の参照は、完全な厳密な名前のSystem.Net.dllを参照しています。したがって、あなたは秘密鍵を持っていないので、あなたはこれらの型転送を使って正しく署名されたアセンブリを生成することができませんでした。しかし、MonoDroidでは、厳密な名前や署名の検証方法が異なる場合があります。したがって、MonoDroidが受け入れる型転送を持つSystem.Net.dllを生成し、MonoDroidアプリケーションにパッケージ化することができます。

+0

私は1時間ハッキングしています(MSBuild Xamarin Build Taskハックでも試してみましたが失敗しました)...私はいくつかの成功を収めています!ありがとう。 Twitterを介してさらに報道されます – Stuart

+1

http://slodge.blogspot.co.uk/2012/04/using-portable-library-tools-for.htmlに関するいくつかのメモをブログで投稿しました - 私はモノタッチも機能するようになるとgithubにプッシュします...(現在、モノデベロッパーの問題!) – Stuart

関連する問題