2012-04-28 19 views
9

A continuación de How can I build a targetting pack for Portable Class Libraries? y el consejo en http://jpobst.blogspot.com/2012/04/mono-for-android-portable-libraries-in.html He logrado construir algunos programas de ejemplo de monodroid que usan bibliotecas de clases portátiles.¿Es posible utilizar una Biblioteca de clases portátil que haga referencia a System.Net en MonoDroid?

Sin embargo, si alguna de mis PCL de entrada hace referencia al ensamblado de System.Net, entonces monodroid no puede empaquetar mi apk, porque se queja de File Not Found for System.Net.dll.

Según tengo entendido (desde http://docs.xamarin.com/android/about/assemblies), MonoDroid reúne toda la funcionalidad de System.Net dentro de System.dll.

¿Hay alguna manera en que pueda hacer que MonoDroid use estas PCL que hacen referencia a System.Net?

  • ¿Hay alguna manera de que pueda conseguir que el monodroid packager comprenda este System.net-> sistema de redirección?
  • ¿O hay algún paso previo al paquete que podría ejecutar que "corregiría" la referencia solo para monodroid?
  • ¿O alguna otra sugerencia?

de actualización con información técnica:

El proceso de envasado está fallando a nivel de:

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

Esto está ocurriendo dentro de la tarea de 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> 

importado de:

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

Respuesta

3

Una posible solución (suponiendo que MonoDroid admita el reenvío de tipos) es tener un ensamblado System.Net.dll que reenvía los tipos relevantes a System.dll.

En el .NET Framework completo, creo que esos tipos de System.Net están en System.dll, y si miras en System.Net.dll en .NET 4.0.3 o 4.5, verás TypeForwardedToAttributes para esos tipos , que permiten que las referencias de tipo a System.Net.dll en una biblioteca portátil sean redirigidas a System.dll. La serie de publicaciones de blog de Jeremy Likness en Understanding Portable Libraries entra en detalles sobre cómo funciona todo esto.

Las referencias en una biblioteca portátil se refieren al nombre completo de System.Net.dll. Por lo tanto, no puede producir un ensamblaje correctamente firmado con esos reenvíos de tipo usted mismo, ya que no tiene la clave privada. Sin embargo, MonoDroid puede manejar nombres fuertes o validación de firmas de manera diferente. Por lo tanto, es posible que pueda generar un System.Net.dll con el tipo de reenvío que MonoDroid aceptaría y empaquetarlo con su aplicación MonoDroid.

+0

He estado pirateando durante una hora (también lo intenté y fallé en algunos hacks de MSBuild Xamarin Build Task) y ... ¡tengo cierto éxito! Gracias. Volverá a informar más a través de Twitter – Stuart

+1

Haber publicado algunas notas en http://slodge.blogspot.co.uk/2012/04/using-portable-library-tools-for.html - se enviará a github cuando obtengo el funcionamiento de Monotouch también ... (¡problemas con el monodesarrollo en este momento!) – Stuart

Cuestiones relacionadas