Unity使用Microsoft.Data.SqlClient遇PlatformNotSupportedException错误求助
问题背景
在Unity脚本中通过NuGet插件导入Microsoft.Data.SqlClient库后,运行时触发平台不支持错误:
PlatformNotSupportedException: Microsoft.Data.SqlClient is not supported on this platform.
Microsoft.Data.SqlClient.SqlConnection..ctor(system.string connectionString)
错误发生在代码行:
SqlConnection con = new SqlConnection(_connectionString);
项目基础信息:
- Unity版本:2022.3.41f1
- 目标Microsoft.Data.SqlClient版本:5.2.2
- 脚本编辑器:Rider 2024.3.3
- 目标平台:Windows、Android、WebGL
关联错误提示:
Unity同时报出XML解析错误及多个“Import Error Code(4)”,示例如下:
Message: Build asset version error: assets/packages/microsoft.identity.client.4.61.3/lib/netstandard2.0/microsoft.identity.client.dll.meta in SourceAssetDB has modification time of '2025-01-02T19:10:19.6060966Z' while content on disk has modification time of '2025-01-02T19:10:22.8671146Z'
已尝试但无效的操作:
- 手动编辑.csproj文件添加包引用,被Unity构建时重置
- 复制DLL到Assets>Packages文件夹,未生效且出现未安装的预览版库
- 修改API兼容性级别为.NET Standard 4.x或.NET Framework,错误依旧
分步解决方案
1. 针对性解决平台兼容问题
不同平台对Microsoft.Data.SqlClient的支持差异极大,需分别处理:
- Windows平台:
- 将Unity的API兼容性级别设置为
.NET Framework 4.x(路径:Edit > Project Settings > Player > Other Settings > Configuration) - 删除项目根目录下的
Library文件夹,执行Assets > Reimport All清除旧缓存,确保Unity重新生成适配的项目文件 - 确认NuGet导入的是适配.NET Framework的5.2.2版本,避免误装.NET Core专属包
- 将Unity的API兼容性级别设置为
- Android平台:
Microsoft.Data.SqlClient对Android仅提供实验性支持,稳定性极差。建议改用Sqlite-net本地数据库,或通过后端API中转SQL Server请求,不要直接在客户端连接数据库 - WebGL平台:
WebGL运行时完全不支持Microsoft.Data.SqlClient(无系统级网络套接字权限),必须通过后端API代理所有数据库操作
2. 修复NuGet导入的错误
- 彻底清理旧包残留:
删除Assets/Packages下所有Microsoft.Data.SqlClient、microsoft.identity.client相关文件,同时删除Packages/manifest.json中对应的包引用,重启Unity后重新通过NuGet插件安装指定版本5.2.2,勾选“稳定版”过滤预览包 - 修复meta文件时间戳错误:
删除报错的.meta文件,Unity会自动重新生成正确的元数据,之后执行Assets > Refresh刷新资源
3. 正确配置项目文件(替代手动编辑.csproj)
- 开启Unity的自动生成项目文件功能:
Edit > Preferences > External Tools,勾选Generate .csproj files for:下的所有选项 - 使用NuGetForUnity插件的
Force Restore功能(插件菜单:NuGet > Restore Packages),强制Unity同步正确的包引用,避免构建时重置配置
4. 验证库加载状态
在脚本中添加调试代码,确认库是否成功加载:
#if UNITY_EDITOR || UNITY_STANDALONE_WIN void CheckLibraryLoad() { try { var assembly = System.Reflection.Assembly.Load("Microsoft.Data.SqlClient"); Debug.Log($"库加载成功:{assembly.FullName}"); } catch (System.Exception ex) { Debug.LogError($"库加载失败:{ex.Message}"); } } #endif
内容的提问来源于stack exchange,提问作者Hayden Ridgeway

