Mac M1下ServiceStack ORMLite SQLite运行报错问题咨询
报错根因
当前引用的System.Data.SQLite携带的SQLite.Interop.dll是Windows平台专属原生动态库,MacOS作为类Unix系统无法识别加载该格式的库文件,运行时找不到对应Mac平台的原生实现就会抛出该异常。
适配方案
方案1:替换跨平台SQLite驱动(推荐,改造成本最低)
直接替换掉仅支持Windows的System.Data.SQLite,使用全平台兼容的SQLite实现,无需针对不同系统做单独配置:
- 卸载项目中原有
System.Data.SQLite相关的Nuget包 - 安装ORMLite官方适配的跨平台SQLite包
ServiceStack.OrmLite.Sqlite.Data,该包依赖微软维护的Microsoft.Data.Sqlite,原生支持Windows、MacOS、Linux - 调整数据库连接初始化代码,将原SQLite方言提供器替换为
SqliteDataDialect.Provider即可,内存库连接字符串、仓储层CRUD逻辑完全不需要修改,原有测试代码可以直接复用。
方案2:保留原有驱动补全跨平台原生依赖
如果暂时不想替换现有驱动,可以通过补充跨平台原生绑定库解决加载问题:
- 在测试项目中安装
SQLitePCLRaw.bundle_e_sqlite3包,该包会自动携带全平台的SQLite原生库,自动适配运行时系统 - 在测试项目的
.csproj文件中添加如下配置,清理原有Windows专属互操作库的输出,避免冲突:
<Target Name="CleanWindowsNativeLib" AfterTargets="Build"> <Delete Files="$(OutDir)SQLite.Interop.dll" /> </Target>
- 在测试初始化逻辑(如测试类的构造函数、Assembly初始化钩子)中添加一行初始化代码,完成原生库绑定:
SQLitePCL.Batteries.Init();
执行完上述配置后,清空之前的构建缓存重新生成项目即可。
方案3:本地临时适配(无代码修改方案)
如果只是临时在Mac上跑测试,不想修改项目代码或依赖,可以通过系统SQLite库做软链接映射绕过加载检查:
- 用Homebrew安装系统级SQLite:
brew install sqlite
- 根据自己Mac的芯片架构找到brew安装的SQLite动态库路径:
- Apple Silicon芯片默认路径:
/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib - Intel芯片默认路径:
/usr/local/opt/sqlite/lib/libsqlite3.dylib
- Apple Silicon芯片默认路径:
- 进入报错提示的测试项目输出目录(示例路径为
/Users/aaron/Projects/joinder/DASH/Test/ClientSiteData.Tests/bin/Debug/net6.0/),执行软链接命令,将运行时查找的库名映射到本地系统SQLite库:
# Apple芯片示例,Intel芯片替换成对应路径即可 ln -s /opt/homebrew/opt/sqlite/lib/libsqlite3.dylib libSQLite.Interop.dll
该方案仅对当前输出目录生效,清理构建缓存、切换分支重新生成后需要重新执行软链接,仅适合临时调试场景。
注意:所有方案配置完成后,建议先执行
dotnet clean清空历史构建产物再重新生成运行,避免旧的Windows平台库残留导致加载异常。
内容的提问来源于stack exchange,提问作者devlord
相关产品推荐
相关产品推荐

