UWP应用Debug模式可连SQLite,Release模式触发空值异常求助
从异常栈可以看出,Release模式下调用SQLiteConnection构造函数时,内部的Path.Combine收到了空的path1参数,结合你的代码,说明ApplicationData.Current.LocalFolder.Path在Release模式下返回了null。以下是具体排查步骤:
排查.NET Native编译影响
UWP的Release默认启用.NET Native编译,该编译会对代码进行激进优化,可能导致部分UWP API的初始化逻辑变化。临时禁用.NET Native:右键项目 → 属性 → 生成 → 取消勾选"启用.NET Native工具链",重新编译Release版本测试。如果问题消失,说明是.NET Native与System.Data.SQLite的兼容性问题。显式验证路径参数
修改代码,在创建连接前先验证关键参数,避免隐式拼接带来的定位困难:var localFolder = ApplicationData.Current.LocalFolder; if (localFolder == null) { throw new InvalidOperationException("无法获取应用本地文件夹"); } if (string.IsNullOrEmpty(DB_NAME)) { throw new InvalidOperationException("数据库名称未定义"); } var dbFullPath = Path.Combine(localFolder.Path, DB_NAME); Connection = new SqliteConnection($"Data Source={dbFullPath}");重新编译Release版本,观察抛出的异常是否更明确,或者通过日志记录
localFolder.Path和DB_NAME的实际值。检查条件编译常量
确认DB_NAME的定义是否包含条件编译逻辑(比如#if DEBUG),导致Release模式下DB_NAME为空字符串。可以在代码中添加日志输出DB_NAME的值,或者直接查看常量定义。替换SQLite NuGet包
System.Data.SQLite对UWP的.NET Native支持并不完善,建议替换为微软官方维护的Microsoft.Data.Sqlite包,该包针对UWP和现代.NET环境做了优化,兼容性更好。替换后调整命名空间引用即可:using SqliteConnection = Microsoft.Data.Sqlite.SqliteConnection;确认应用权限与目录状态
虽然LocalState是应用私有目录无需额外权限,但可以检查Release模式下应用是否能正常访问该目录:先通过代码尝试在LocalState下创建一个临时文件,验证目录的可用性,排除目录访问异常导致的路径获取失败。
内容的提问来源于stack exchange,提问作者Hele

