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

时间:2017-02-17 13:45:05

标签: c# visual-studio-2015 xamarin.android nuget .net-standard

Curent状态

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

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。

问题

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

  

加载程序集时出现异常:System.IO.FileNotFoundException:   无法加载程序集' Microsoft.EntityFrameworkCore.Sqlite,   Version = 1.1.0.0,Culture = neutral,PublicKeyToken = adb9793829ddae60'。   也许它在Mono for Android配置文件中不存在?

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

当然,MyAndroidApp不会直接拨打Microsoft.EntityFrameworkCore.Sqlite。相反,MyPclLibrary负责与Sqlite进行通信。

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

我已经尝试了什么?

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

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

1 个答案:

答案 0 :(得分:2)

依赖管理有两种不同的方式,就像你的猜测一样。 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项目中。