是否可以使用在MonoDroid中引用System.Net的可移植类库?

问题描述:

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示例程序。是否可以使用在MonoDroid中引用System.Net的可移植类库?

但是,如果我的任何输入PCLS的引用System.Net组装,然后MonoDroid的失败来包装我的APK - 因为它抱怨找不到文件的System.Net.dll。

据我所知(从http://docs.xamarin.com/android/about/assemblies),MonoDroid的捆绑内System.dll中的所有System.Net功能。

有没有什么办法可以让MonoDroid使用这些参考System.Net的PCL?

  • 有没有什么办法可以让monodroid打包者了解这个System.net->系统重定向?
  • 还是有一些预包装的步骤,我可以运行,将“纠正”引用只为monodroid?
  • 还是有其他建议?

    包装过程目前未能在水平:

    <!-- 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> 
    

    "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任务内发生


与技术信息更新

从:

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

一个可能的解决方案(假设MonoDroid支持类型转发)是有一个System.Net.dll程序集类型转发相关类型到System.dll。

在完整的.NET框架,我相信那些System.Net类型是在System.dll中,如果你在System.Net.dll看看.NET的4.0.3或4.5,你会看到TypeForwardedToAttributes这些类型,它允许将可移植库中的System.Net.dll类型引用重定向到System.dll。 Jeremy Likness的关于Understanding Portable Libraries的博客文章系列详细介绍了这一切如何运作。

便携库中的引用是指System.Net.dll的完整强名称。所以你不能用自己的类型转发正确签名的程序集,因为你没有私钥。但是,MonoDroid可能会以不同的方式处理强名称或签名验证。所以你可以用MonoDroid可以接受的类型转发来生成一个System.Net.dll,并将其与MonoDroid应用程序打包在一起。

+0

我一直在黑客一个小时(也试过,并在一些MSBuild Xamarin构建任务黑客失败)和...我有一些成功!谢谢。将通过Twitter报告更多 – Stuart 2012-04-29 09:11:50

+1

已经在http://slodge.blogspot.co.uk/2012/04/using-portable-library-tools-for.html上发布了一些注释 - 当我获得monotouch工作时,也会推送给github ...(目前monodevelop的问题!) – Stuart 2012-04-30 13:41:59