我是ASP.NET的长期开发人员,但是对Xamarin还是陌生的。我在Visual Studio 2017内的Core 2.0上有一个非常简单的NETStandard Xamarin Android项目。我刚刚开始构建我的应用程序。在普通项目中,我使用Microsoft.Data.Sqlite处理本地数据库。除了Xamarin.Forms和NETStandard,这是我唯一引入的库。
编辑:我应该注意,在我从Android API 26升级到27之前,该应用程序可以正常编译。我没有更改任何代码。问题不是我的代码,而是项目配置或NuGet。
这是与任何特定文件都不相关的编译时错误:
加载程序集时出现异常:System.IO.FileNotFoundException:无法加载程序集' Microsoft.Data.Sqlite ,版本= 2.1.0.0,区域性=中性,PublicKeyToken = adb9793829ddae60'。也许在Mono for Android配置文件中不存在? 文件名:“ Microsoft.Data.Sqlite.dll” 在Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve(AssemblyNameReference参考,ReaderParameters参数) 在Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(DirectoryAssemblyResolver解析器,ICollection`1程序集,AssemblyDefinition程序集,布尔型topLevel) 在Xamarin.Android.Tasks.ResolveAssemblies.Execute(DirectoryAssemblyResolver解析器)
我不知道为什么Android应用程序需要Sqlite,因为数据库项目由普通项目处理。这似乎是一条红色的鲱鱼,但我无法使这个错误消失。
这是MyApp的NuGet(常见项目):
这是MyApp.Android的NuGet:
我的第一个直觉是,这个长长的清单是不对的,但是我所做的只是Install-Package Xamarin.Forms
,其他所有事情都随之而来。在安装Xamarin.Forms之前,我removed all NuGet packages。我已经和NuGet战斗了一段时间了,所以“默认”列表不再一样了。我曾经在这里将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通知时崩溃了)。在一切正常运行时以及在我尝试将API从26升级到27之前,MyApp都没有这两个问题。
是的,我已经无数次清理并重建了项目,并清除了NuGet缓存。
我正在尝试使用(最新的)Android API27。我相信我是在API 26下创建MyApp的,但我不确定。
我要做的就是为使用Microsoft.Data.Sqlite的Android API 27创建一个Xamarin Forms应用程序!为什么这么难?我在这个项目上花费了90%以上的时间来对抗我未编写的代码!
答案 0 :(得分:0)
Xamarin Forms / Visual Studio容易引起混淆。有时,只是重新启动VS可能会消除某些错误。通常,我将关闭VS,核对所有obj + bin目录,并核对.vs目录。这将清除许多缓存的碎片。更改主要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和https://github.com/bordoley/SQLitePCL.pretty。我意识到其他nuget包可能取决于Mono.Data.Sqlite