加载程序集时出现异常:无法加载程序集 'Microsoft.Data.Sqlite'

Exception while loading assemblies: Could not load assembly 'Microsoft.Data.Sqlite'

我是 ASP.NET 的长期开发人员,但对 Xamarin.我有一个非常简单的 Android NETStandard Xamarin 项目,它是在 Visual Studio 2017 年的 Core 2.0 上构建的。我刚刚开始构建我的应用程序。在公共项目中,我使用 Microsoft.Data.Sqlite 来处理本地数据库。这是除了 Xamarin.Forms 和 NETStandard 之外我唯一引入的库。

编辑:我应该注意到,在我从 Android API 26 升级到 27 之前,这个应用程序过去编译得很好。我没有更改任何代码。问题不是我的代码,而是项目配置或 NuGet。

这是与任何特定文件无关的编译时错误:

Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'Microsoft.Data.Sqlite, Version=2.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Perhaps it doesn't exist in the Mono for Android profile? File name: 'Microsoft.Data.Sqlite.dll' at Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters) at Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(DirectoryAssemblyResolver resolver, ICollection`1 assemblies, AssemblyDefinition assembly, Boolean topLevel) at Xamarin.Android.Tasks.ResolveAssemblies.Execute(DirectoryAssemblyResolver resolver)

我不知道为什么 Android 应用程序需要 Sqlite,因为数据库的东西正在由公共项目处理。这似乎是一个转移注意力的问题,但我无法消除此错误。

这是 MyApp 的 NuGet(普通项目):

这是 MyApp.Android:

的 NuGet

我的第一直觉是这个长列表不对,但我所做的只是 Install-Package Xamarin.Forms,所有这些其他事情都随之而来。在安装 Xamarin.Forms 之前,我 removed all NuGet packages。我已经与 NuGet 斗争了一段时间,所以 "default" 列表不再一样了。我曾在这里使用过 Crosslight,可能还有 Sqlite。当我创建一个全新的 Xamarin Forms 应用程序时,只有六个包:Xamrin.Forms (v3.1.0), Xamarin.Android.Support.v4 (v27.0.2), ...v7.AppCompat ( v27.0.2)、...v7.CardView (v27.0.2) 和...v7.MediaRouter (v27.0.2),尽管它们不是最新版本。

我已经筋疲力尽了Google。我能找到的最接近解决这个问题的是 this GitHub issue for Mono,但特定的库是 System.Drawing.Common,而不是 Microsoft.Data.Sqlite。就该线程而言,这是 Mono 的一个错误。如果是这样,解决方法是什么?

我是否应该担心 MyApp.Android 混合了 Support.v4 和 Support.v7?

如果这是一个线索,MyApp 已经经历了很多按摩和 NuGet 的尝试,以使各种事情发挥作用。我安装了许多库,后来又删除了它们。我编辑了 .sln 和 .csproj 文件,我多次删除了 Packages、obj 和 bin 文件夹。 (.csproj 文件中未引用 SQLite。)

我尝试将我的代码从 MyApp 复制到新的 Xamarin Forms MyApp2,但这有不同的问题(尽管代码相同,但未找到 Sqlite 数据库并在显示 toast 通知时崩溃)。 MyApp 上周没有任何这些问题,当时一切都是 运行,在我尝试将 API 从 26 升级到 27 之前。

是的,我已经无数次清理和重建我的项目,并清除了 NuGet 缓存。

我正在尝试使用(最新)Android API 27。我相信我在 API 26 下创建了 MyApp,但我不确定。

我只想为 Android API 27 创建一个使用 Microsoft.Data.Sqlite 的 Xamarin Forms 应用程序!为什么这么难?我在这个项目上花费了超过 90% 的时间来处理我没有编写的代码!

Xamarin Forms/Visual Studio 很容易混淆。有时某些错误可能会在重新启动 VS 时消失。我通常会关闭 VS,核对所有 obj + bin 目录,并核对 .vs 目录。这将清除很多缓存的 cruff。更改主要 XF 版本后始终关闭 + 重新打开 VS。 (2.0<->2.5、2.5<->3.0、3.0<->3.1 等)

除此之外,由于显式和隐式引用的 nuget 包的大型依赖树,可能会出现各种 nuget 包不兼容的情况。

Mono.Data.Sqlite 是一个奇怪的情况,因为单声道程序集和 .net 程序集之间存在一些冗余,您必须专门添加该程序集。请参阅:https://forums.xamarin.com/discussion/99947/how-to-reference-mono-data-sqlite 您可能必须明确地找到该程序集并将其添加到您的项目中。呸。

通常我不会将它用于 sqlite,而更喜欢 https://github.com/praeclarum/sqlite-net and https://github.com/bordoley/SQLitePCL.pretty。我意识到其他 nuget 包可能依赖于 Mono.Data.Sqlite