# LanMountainDesktop 启动器无法启动应用 - 问题分析与修复计划 ## 1. 项目架构概述 LanMountainDesktop 采用**双进程架构**: - **Launcher** (`LanMountainDesktop.Launcher`) - 启动器,负责版本管理、更新、启动主程序 - **Host** (`LanMountainDesktop`) - 主应用宿主 ### 启动流程 1. 用户启动 `LanMountainDesktop.Launcher.exe` 2. Launcher 扫描 `app-*` 目录,选择最佳版本 3. 检查并应用待处理的更新 4. 处理插件升级队列 5. 启动主程序 `app-{version}/LanMountainDesktop.exe` 6. 通过 IPC 监控主程序启动进度 ## 2. 问题分析 ### 2.1 核心问题:主机可执行文件找不到 根据代码分析(`DeploymentLocator.cs`),启动器通过以下顺序查找主机可执行文件: 1. **显式 app-root**(如果通过命令行指定) 2. **已发布部署**(查找 `app-*` 目录) 3. **可移植主机**(直接在应用根目录) 4. **调试主机**(开发模式,查找构建输出路径) 5. **旧版回退路径** **当前状态检查**: - ❌ 未找到 `app-*` 目录(生产部署结构不存在) - ❌ 未找到 `bin/Debug/**/*.exe`(项目未构建或构建输出不存在) ### 2.2 可能的启动失败原因 | 问题 | 描述 | 优先级 | |------|------|--------| | **项目未构建** | LanMountainDesktop 主程序未编译,没有可执行文件 | P0 | | **部署结构缺失** | 生产模式下缺少 `app-*` 目录结构 | P0 | | **开发模式路径问题** | 调试模式下路径计算错误或构建输出不在预期位置 | P1 | | **.NET 版本问题** | 项目使用 .NET 10.0,运行环境可能缺少对应运行时 | P1 | | **更新应用失败** | `ApplyPendingUpdateAsync` 失败导致无法完成部署 | P2 | | **IPC 连接超时** | 主程序启动后未及时建立 IPC 连接,导致启动器超时 | P2 | ### 2.3 关键代码位置 - **主机查找逻辑**: `LanMountainDesktop.Launcher/Services/DeploymentLocator.cs` - `FindCurrentDeploymentDirectory()` - 查找 app-* 目录 - `ResolveHostExecutable()` - 解析主机路径 - **启动协调逻辑**: `LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.cs` - `RunAsync()` - 主启动流程 - `LaunchHostWithIpcAsync()` - 启动主机进程 - **更新引擎**: `LanMountainDesktop.Launcher/Services/UpdateEngineService.cs` - `ApplyPendingUpdateAsync()` - 应用待处理的更新 ## 3. 诊断步骤 ### 步骤 1:检查构建状态 ```bash dotnet --info dotnet build LanMountainDesktop.slnx -c Debug ``` ### 步骤 2:验证主机可执行文件是否存在 检查以下路径是否存在 `LanMountainDesktop.exe`: - `LanMountainDesktop/bin/Debug/net10.0/` - `LanMountainDesktop/bin/Release/net10.0/` ### 步骤 3:测试直接运行主程序(跳过 Launcher) ```bash dotnet run --project LanMountainDesktop/LanMountainDesktop.csproj ``` ### 步骤 4:检查 Launcher 启动日志 在开发模式下运行 Launcher 并查看控制台输出: ```bash dotnet run --project LanMountainDesktop.Launcher/LanMountainDesktop.Launcher.csproj -- launch ``` ## 4. 修复计划 ### 方案 A:构建并配置开发环境(推荐) **适用场景**:开发或调试环境 1. **构建整个解决方案** ```bash dotnet restore dotnet build LanMountainDesktop.slnx -c Debug ``` 2. **验证构建输出** - 确认 `LanMountainDesktop/bin/Debug/net10.0/LanMountainDesktop.exe` 存在 - 确认 `LanMountainDesktop.Launcher/bin/Debug/net10.0/LanMountainDesktop.Launcher.exe` 存在 3. **测试 Launcher 启动** ```bash dotnet run --project LanMountainDesktop.Launcher/LanMountainDesktop.Launcher.csproj -- launch ``` 4. **如果路径查找失败,检查 `DeploymentLocator.cs` 中的开发路径** - 当前逻辑(第 366-375 行)查找: - `../LanMountainDesktop/bin/Debug/net10.0/LanMountainDesktop.exe` - `../LanMountainDesktop/bin/Release/net10.0/LanMountainDesktop.exe` - 确认这些路径与实际的构建输出路径匹配 ### 方案 B:创建生产部署结构 **适用场景**:生产环境或模拟生产环境 1. **发布主程序** ```bash dotnet publish LanMountainDesktop/LanMountainDesktop.csproj -c Release -o app-1.0.0 ``` 2. **创建 .current 标记文件** ```bash echo. > app-1.0.0/.current ``` 3. **从 Launcher 启动** - Launcher 应该能找到 `app-1.0.0/LanMountainDesktop.exe` ### 方案 C:修复潜在的代码问题 如果上述方案无法解决问题,可能需要修复代码: #### C1. 增强错误处理和日志 在 `DeploymentLocator.cs` 中添加更详细的日志输出,帮助诊断路径查找失败的原因。 #### C2. 检查更新逻辑 如果 `ApplyPendingUpdateAsync` 失败,可能导致启动中止。检查 `.launcher/update/incoming/` 目录是否有残留的更新文件。 #### C3. 调整超时设置 如果主程序启动较慢,可以适当增加 `LauncherFlowCoordinator.cs` 中的超时时间: - `StartupSoftTimeout` (当前 10 秒) - `StartupHardTimeout` (当前 30 秒) ## 5. 建议执行顺序 1. ✅ **首先执行方案 A 的步骤 1-2**(构建项目) 2. ✅ **执行诊断步骤 3**(测试直接运行主程序) 3. ✅ **执行诊断步骤 4**(查看 Launcher 启动日志) 4. 根据日志输出决定后续操作: - 如果显示 "host executable was not found" → 检查路径配置 - 如果显示 "update apply failed" → 清理更新缓存 - 如果主程序启动后超时 → 检查 IPC 连接或增加超时 ## 6. 验证方法 修复后,通过以下方式验证: ```bash # 开发模式启动 dotnet run --project LanMountainDesktop.Launcher/LanMountainDesktop.Launcher.csproj -- launch # 或直接运行 Launcher 可执行文件 # (需要先构建 Launcher) ``` 启动后应该看到: 1. Splash 窗口显示 2. 主程序桌面窗口出现 3. Launcher 自动退出(或最小化到托盘) ## 7. 注意事项 - 项目使用 .NET 10.0(`global.json` 指定版本 10.0.103) - 确保开发环境已安装对应的 .NET SDK - 如果修改了 `DeploymentLocator.cs` 的路径查找逻辑,需要同步更新文档 `docs/DEVELOPMENT.md`