mirror of
https://github.com/wwiinnddyy/LanMountainDesktop.git
synced 2026-06-20 23:54:26 +08:00
172 lines
6.0 KiB
Markdown
172 lines
6.0 KiB
Markdown
|
|
# 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`
|