2012-04-28 13 views
9

seguito da How can I build a targetting pack for Portable Class Libraries? e il consiglio in http://jpobst.blogspot.com/2012/04/mono-for-android-portable-libraries-in.html Sono riuscito a creare alcuni programmi di esempio monodroid che utilizzano librerie di classi portatili.È possibile utilizzare una libreria di classi portatili che fa riferimento a System.Net in MonoDroid?

Tuttavia, se uno dei miei PCL di input fa riferimento all'assembly System.Net, quindi monodroid non riesce a comprimere il mio apk - perché si lamenta di File Not Found per System.Net.dll.

Come ho capito (da http://docs.xamarin.com/android/about/assemblies), MonoDroid raggruppa tutte le funzionalità di System.Net all'interno di System.dll.

C'è un modo per far sì che MonoDroid utilizzi questi PCL che fanno riferimento a System.Net?

  • C'è un modo per far sì che il packager monodroid capisca questo reindirizzamento System.net-> System?
  • Oppure è possibile eseguire un pre-pacchetto che potrebbe "correggere" il riferimento solo per monodroid?
  • O altri suggerimenti?

aggiornamento con informazioni tecniche:

Il processo di confezionamento è attualmente fallendo a livello di:

"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] 

Questo sta avvenendo all'interno del task 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> 

importato da:

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

risposta

3

Una possibile soluzione (presupponendo che MonoDroid supporti l'inoltro dei tipi) consiste nell'avere un assembly System.Net.dll che digita i tipi rilevanti in System.dll.

Nel completo .NET Framework, credo che quei tipi di System.Net siano in System.dll e se si guarda in System.Net.dll su .NET 4.0.3 o 4.5, si vedrà TypeForwardedToAttributes per quei tipi , che consente a quei riferimenti di tipo a System.Net.dll in una libreria portatile di essere reindirizzati a System.dll. La serie di post sul blog di Jeremy Likness su Understanding Portable Libraries riporta alcuni dettagli su come funziona tutto questo.

I riferimenti in una libreria portatile fanno riferimento al nome completo completo di System.Net.dll. Quindi non è possibile produrre un assembly firmato correttamente con quel tipo in avanti, poiché non si dispone della chiave privata. Tuttavia, MonoDroid può gestire i nomi forti o la convalida della firma in modo diverso. Quindi potresti essere in grado di produrre un file System.Net.dll con il tipo in avanti accettato da MonoDroid e comprimerlo con l'applicazione MonoDroid.

+0

Ho hackerato per un'ora (anche provato e fallito in alcuni hack di MSBuild Xamarin Build Task) e ... Ho un po 'di successo! Grazie. Segnaleremo di nuovo via Twitter – Stuart

+1

Ho bloggato alcune note su http://slodge.blogspot.co.uk/2012/04/using-portable-library-tools-for.html - spingerò a github quando ottengo anche il funzionamento di monotouch ... (problemi con monodevelop al momento!) – Stuart

Problemi correlati