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