9

如何为可移植类库构建目标包?以及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.Net 功能捆绑在 System.dll 中。

有什么方法可以让 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]

这发生在 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" />
4

1 回答 1

3

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

在完整的 .NET Framework 中,我相信那些 System.Net 类型位于 System.dll 中,如果您在 .NET 4.0.3 或 4.5 上查看 System.Net.dll,您将看到这些类型的TypeForwardedToAttributes,它允许那些在要重定向到 System.dll 的可移植库中键入对 System.Net.dll 的引用。Jeremy Likness 关于理解便携式库的系列博文详细介绍了这一切是如何工作的。

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

于 2012-04-29T05:53:27.653 回答