.NET Maui与WorkerService共享SQLite数据库文件路径配置问题
解决方案
核心问题
你当前的路径逻辑依赖项目目录结构,但MSIX打包后,应用安装目录是只读的,且WorkerService的工作目录和MAUI应用不一致,导致路径定位失败。不能把数据库放在项目目录内,必须迁移到双方都能访问的读写目录。
步骤1:迁移数据库到应用数据目录
将数据库文件ADIOrderTracker.db从项目目录移到应用的本地应用数据目录,这个目录是用户级的读写目录,MAUI和WorkerService都有权限访问。
- 右键项目里的数据库文件→属性→生成操作改为「嵌入的资源」,取消「复制到输出目录」的设置。
- 首次运行时,从嵌入资源将数据库复制到应用数据目录(避免覆盖已有用户数据)。
步骤2:统一获取共享路径
在MAUI和WorkerService中使用完全相同的路径逻辑:
// 获取系统提供的本地应用数据目录,MAUI和WorkerService均可访问 string appDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); // 创建应用专属子目录,避免与其他应用冲突 string appSpecificDir = Path.Combine(appDataDir, "ADIOrderTracker"); Directory.CreateDirectory(appSpecificDir); // 确保目录存在 // 最终数据库文件路径 string databaseFilePath = Path.Combine(appSpecificDir, "ADIOrderTracker.db"); // 首次运行时复制嵌入的初始数据库(仅当文件不存在时执行) if (!File.Exists(databaseFilePath)) { using var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ADIOrderTracker.ADIOrderTracker.db"); using var fileStream = new FileStream(databaseFilePath, FileMode.Create); resourceStream.CopyTo(fileStream); } // 构建连接字符串 string connectionString = $"Data Source={databaseFilePath};"; _logger.LogInformation($"Database file path: {databaseFilePath}");
注意:嵌入资源名称格式为
[项目命名空间].[文件路径],如果数据库在项目根目录、命名空间是ADIOrderTracker,资源名称就是ADIOrderTracker.ADIOrderTracker.db,可通过Assembly.GetExecutingAssembly().GetManifestResourceNames()确认具体名称。
步骤3:MSIX打包配置
确保WorkerService被包含在MAUI的MSIX包内:
- 右键MAUI项目→添加→引用,勾选WorkerService项目。
- 打包时MSIX会自动包含WorkerService的依赖,且双方能访问同一个应用数据目录。
方案优势
- 应用数据目录是系统标准读写目录,无权限问题。
- 统一的路径逻辑确保测试环境和发布后的MSIX包都能准确定位数据库。
- 嵌入资源方式保证初始数据库被打包进MSIX,首次运行自动部署到可读写目录。
内容的提问来源于stack exchange,提问作者Braydon Griffith
相关产品推荐
相关产品推荐

