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

Stu*_*art 9 msbuild xamarin.android portable-class-library

以下内容如何为便携式类库构建目标包?以及http://jpobst.blogspot.com/2012/04/mono-for-android-portable-libraries-in.html中的建议我设法构建了一些使用Portable Class Libraries的monodroid示例程序.

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

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

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

  • 有什么方法可以让monodroid打包器了解这个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]
Run Code Online (Sandbox Code Playgroud)

这是在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>
Run Code Online (Sandbox Code Playgroud)

进口自:

  <UsingTask TaskName="Xamarin.Android.Tasks.ResolveAssemblies" AssemblyFile="Novell.MonoDroid.Build.Tasks.dll" />
Run Code Online (Sandbox Code Playgroud)

Dan*_*ted 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 的关于了解便携式库的博客文章系列详细介绍了这一切是如何工作的。

可移植库中的引用是指 System.Net.dll 的完整强名称。因此,您无法自己使用这些类型转发生成正确签名的程序集,因为您没有私钥。然而,MonoDroid 可能会以不同的方式处理强名称或签名验证。因此,您也许能够生成一个具有 MonoDroid 接受的类型转发的 System.Net.dll,并将其与您的 MonoDroid 应用程序打包在一起。