MAUI应用iOS平台操作SQLite时触发System.Windows.Forms加载失败异常
问题场景
MAUI应用读写本地SQLite数据库时,Android平台运行正常,iOS平台抛出文件找不到异常。
异常详情
System.IO.FileNotFoundException: 无法加载文件或程序集'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'或其依赖项之一。
文件名: 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
at MyApp.SqlHelper.GetConnection() in /Users/MyCompany/Projects/MyProject-maui/MyProject/Renderers/SqlHelper.cs:line 28
at MyApp.SqlHelper..ctor() in /Users/MyCompany/Projects/MyProject-maui/MyProject/Renderers/SqlHelper.cs:line 18
at MyProject.App.get_Database() in /Users/MyCompany/Projects/MyProject-maui/MyProject/App.xaml.cs:line 92
已安装的NuGet包
<PackageReference Include="sqlite-net-pcl" Version="1.8.116" /> <PackageReference Include="SQLiteNetExtensions.Async" Version="2.1.0" /> <PackageReference Include="SQLitePCLRaw.core" Version="2.1.6" /> <PackageReference Include="SQLitePCLRaw.bundle_green" Version="2.1.6" /> <PackageReference Include="SQLitePCLRaw.provider.dynamic_cdecl" Version="2.1.6" /> <PackageReference Include="SQLitePCLRaw.provider.sqlite3" Version="2.1.6" />
相关代码片段
App.xaml.cs
public static SqlHelper Database { get { if (database == null) { database = new SqlHelper(); } return database; } }
SqlHelper.cs
public SqlHelper() { database = GetConnection();//异常触发于此行 database.CreateTable<Favorites>(); }
GetConnection方法
public SQLite.SQLiteConnection GetConnection() { SQLiteConnection sqlitConnection; var sqliteFilename = "Favorites.db3"; IFolder folder = FileSystem.Current.LocalStorage; string path = PortablePath.Combine(folder.Path.ToString(), sqliteFilename); sqlitConnection = new SQLite.SQLiteConnection(path); return sqlitConnection; }
解决步骤
精简NuGet依赖
SQLitePCLRaw.bundle_green已包含SQLitePCLRaw.core、基础提供者等核心组件,移除重复安装的SQLitePCLRaw.core、SQLitePCLRaw.provider.dynamic_cdecl、SQLitePCLRaw.provider.sqlite3包,避免跨平台依赖冲突。修正路径处理逻辑
iOS平台对文件路径有特殊要求,替换PortablePath.Combine为MAUI原生的Path.Combine,并使用AppDataDirectory确保路径正确性:public SQLite.SQLiteConnection GetConnection() { var sqliteFilename = "Favorites.db3"; string path = Path.Combine(FileSystem.Current.AppDataDirectory, sqliteFilename); return new SQLite.SQLiteConnection(path); }验证iOS平台原生库配置
确认iOS项目自动引入对应平台的SQLite原生库(SQLitePCLRaw.bundle_green通常会自动处理),若仍有问题,可单独添加SQLitePCLRaw.provider.sqlite3.ios包。清理重建项目
- 删除所有项目的
bin和obj目录 - 卸载并重新安装所有NuGet包
- 重启开发工具后重新编译iOS项目
- 删除所有项目的
内容的提问来源于stack exchange,提问作者Sreejith Sree

