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

时间:2012-04-28 07:15:48

标签: msbuild xamarin.android portable-class-library

关注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示例程序。

但是,如果我的任何输入PCL引用System.Net程序集,则monodroid无法打包我的apk - 因为它抱怨System.Net.dll找不到文件。

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

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

  • 有什么方法可以让monodroid packager了解这个System.net->系统重定向?
  • 或者是否有一些我可以运行的预包装步骤可以“纠正”仅针对monodroid的引用?
  • 或任何其他建议?

使用技术信息进行更新:

包装过程目前失败的程度为:

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

1 个答案:

答案 0 :(得分:3)

一个可能的解决方案(假设MonoDroid支持类型转发)是一个System.Net.dll程序集,它将相关类型转发给System.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应用程序打包。