EntityFramework与Xamarin Forms .NET Standard 2.0程序集加载异常问题
解决Xamarin.Android中EF Core 2.0.1的System.Runtime.CompilerServices.Unsafe异常问题
我之前做Xamarin Forms项目时碰到过一模一样的情况——UWP端跑起来完全正常,Android一启动就因为找不到System.Runtime.CompilerServices.Unsafe崩溃,折腾了好一阵才搞定,给你几个实用的解决思路:
核心原因
EF Core 2.0.1依赖的System.Runtime.CompilerServices.Unsafe程序集,在Android 7.1(API25)及以下的Mono运行环境中,默认的程序集加载逻辑没法正确匹配到适配版本;而Android 8.0(API26)的运行环境对这个程序集的支持做了优化,所以切换目标版本后能正常运行。
具体解决方案
1. 配置程序集绑定重定向(无需升级目标版本)
这是我最推荐的方法,不用改动项目的Android版本要求,就能解决依赖问题:
- 在Android项目的
Assets文件夹下新建bindingRedirects.xml文件,粘贴以下内容:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
- 右键这个文件选择属性,把生成操作设置为
AndroidAsset,应用运行时会自动读取配置处理程序集版本重定向。
2. 仅升级目标Android版本(兼容低版本设备)
如果你不想改配置,可以保留最低支持版本为7.1,只调整目标版本:
- 右键Android项目 → 属性 → Android Manifest,在目标Android版本下拉框选择
Android 8.0 (API level 26),同时把最低Android版本设回你需要的版本(比如7.1),这样既解决异常,又不影响旧设备兼容性。
3. 更新EF Core及依赖包版本
EF Core 2.0.x对Xamarin Android的兼容性确实存在不少问题,升级到2.1.x及以上版本能从根源上解决这类依赖冲突:
- 在NuGet包管理器中,把
Microsoft.EntityFrameworkCore及其相关包(比如Microsoft.EntityFrameworkCore.Sqlite等)升级到2.1.x或更高版本,同时确保System.Runtime.CompilerServices.Unsafe包也更新到对应兼容版本。
额外排查技巧
- 检查Android项目的NuGet包列表,确认
System.Runtime.CompilerServices.Unsafe已正确安装,无版本冲突警告; - 清理整个解决方案,手动删除项目的
bin和obj文件夹后重新生成,避免旧缓存程序集干扰加载逻辑。
内容的提问来源于stack exchange,提问作者phil soady
相关产品推荐
相关产品推荐

