# 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`
