Xamarin Android 引用的 PCL 引用的 Nuget 包(EF Core Sqlite)未复制到 bin

Nuget package (EF Core Sqlite) referenced by PCL referenced by Xamarin Android not copied to bin

当前状态

我有以下设置(简化示例):

MySolution
┠ MyPclLibrary (PCL targeting .NET Standard 1.3)
┃ ┗ Referencing Microsoft.EntityFrameworkCore.Sqlite (NuGet package)
┕ MyAndroidApp (Xamarin Android)
   ┗ Referencing MyPclLibrary

换句话说,MyAndroidApp 引用了 MyPclLibrary,后者又引用了作为 NuGet 包安装的 Microsoft.EntityFrameworkCore.Sqlite。我在 Window 7 SP1 机器上使用 Visual Studio 2015 Update 3。

问题

现在的问题是,当我尝试构建解决方案时,我收到以下错误消息:

Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'Microsoft.EntityFrameworkCore.Sqlite, Version=1.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Perhaps it doesn't exist in the Mono for Android profile?

我已经检查了 MyAndroidApp\bin\Debug 目录,我可以看到 Sqlite DLL 没有被复制到输出目录。

当然,MyAndroidApp 不会直接调用 Microsoft.EntityFrameworkCore.Sqlite。相反,MyPclLibrary 负责与 Sqlite 的通信。

我最好的猜测是这个问题与基于 project.json 的新依赖管理有某种关系(MyPclLibrary 使用 project.jsonMyAndroidApp 使用 packages.config).

我已经尝试了什么?

  1. 直接引用(有效但不可接受): 一个简单的解决方法是直接从 MyAndroidApp 添加对 Microsoft.EntityFrameworkCore.Sqlite 的引用 - 所以使图书馆第一个 class 参考。然而,这完全违背了解决方案架构,因此是不可接受的。
  2. Dummy class:我认为问题可能是没有明显的Sqlite用法(因为它基本上是一组扩展方法)。因此,我用一个强制调用 Sqlite 的方法创建了一个虚拟 class,因此 Sqlite 可能无法优化 - 无济于事。
  3. Adnroid 选项中没有链接器:我已将 Project Properties (of MyAndroidApp) -> Android Options -> Linker -> Linking 设置为 None,因为 Android 链接器可能会忽略一些使用的程序集完全动态 - 同样,无济于事。

问题

如何在 Xamarin Android 项目中使用辅助引用?我可能错过了一些非常愚蠢的事情,所以我愿意接受任何建议。

正如您猜的那样,有两种不同的依赖管理方式。 MyPclLibrary 项目使用 MyPclLibrary。 deps.json 从输入 project.json 合并 compilationOptions,而 MyAndroidApp 项目使用 packages.config 将引用 dll 直接复制到 bin 文件夹。所以我们无法从 MyPclLibrary 复制 Sqlite DLL。 deps.json 到 MyAndroidApp\bin\Debug 目录。

此问题的解决方法是直接从 MyAndroidApp 添加对 Microsoft.EntityFrameworkCore.Sqlite 的引用(正如您已经尝试过的那样)。 Building Android Apps with Entity Framework 的默认行为是将 Sqlite NuGet 包添加到 Android 项目。