Files
LanMountainDesktop/.kilo/plans/1776989126427-witty-island.md
2026-04-24 08:24:13 +08:00

6.0 KiB
Raw Blame History

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检查构建状态

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构建并配置开发环境推荐

适用场景:开发或调试环境

  1. 构建整个解决方案

    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 启动

    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. 发布主程序

    dotnet publish LanMountainDesktop/LanMountainDesktop.csproj -c Release -o app-1.0.0
    
  2. 创建 .current 标记文件

    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. 验证方法

修复后,通过以下方式验证:

# 开发模式启动
dotnet run --project LanMountainDesktop.Launcher/LanMountainDesktop.Launcher.csproj -- launch

# 或直接运行 Launcher 可执行文件
# (需要先构建 Launcher)

启动后应该看到:

  1. Splash 窗口显示
  2. 主程序桌面窗口出现
  3. Launcher 自动退出(或最小化到托盘)

7. 注意事项

  • 项目使用 .NET 10.0global.json 指定版本 10.0.103
  • 确保开发环境已安装对应的 .NET SDK
  • 如果修改了 DeploymentLocator.cs 的路径查找逻辑,需要同步更新文档 docs/DEVELOPMENT.md