[Bug] v3.2.0 加速组件无法启动,提示“无法连接加速服务”:子进程继承系统级 DOTNET_ROOT,找不到随包 .NET 11 RC3

Aperta Adatta ai principianti
#4,163 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
70/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
csharp
Ambito
backend, desktop

Direzione di ricerca

Inizia da DotNetRuntimeHelper.GetDotNetRoot() e dalla configurazione del processo figlio di IPCMainProcessServiceImpl descritta nel report. Segui come viene selezionato DOTNET_ROOT e passato a Steam++.Accelerator.exe, quindi verifica il comportamento di avvio dell’acceleratore con un DOTNET_ROOT a livello di macchina che punta a una directory di runtime senza .NET 11. L’obiettivo è raggiunto quando viene trovato il runtime .NET 11 incluso e l’acceleratore si avvia correttamente in questa configurazione.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

问题描述

升级到 3.2.0 后,进入「网络加速」页面一直显示:

无法连接加速服务。请检查加速组件是否正常启动,并允许管理员权限,然后重试。

多次重启、重新安装(包括把 3.2 装到一个全新目录)均无效;回滚到 3.1.0 立刻恢复正常,3.2.0 必现。

复现步骤
  1. 机器上有其他 .NET 安装,并存在机器级环境变量 DOTNET_ROOT=C:\Program Files\dotnet
    (该目录只有 6.0.36 / 8.0.27 / 9.0.7 / 10.0.9,没有 .NET 11)。
  2. 安装 3.2.0(安装包 Steam++_v3.2.0_win_x64.exe,FileVersion 3.2.1.0),
    安装目录下自带运行时 dotnet\shared\Microsoft.NETCore.App\11.0.0-rc.3.26522.148 是存在的。
  3. 启动 Watt Toolkit,打开「网络加速」。
  4. 提示无法连接加速服务,任务管理器中 Steam++.Accelerator.exe 不存在(启动即退出)。
期望行为

加速组件正常启动,网络加速可用。

根本原因

3.2.0 的 Steam++.Accelerator.exe 是 framework-dependent 单文件应用,
runtimeconfig 要求 Microsoft.NETCore.App 11.0.0-rc.3.26522.148。

主程序启动加速组件时走:

IPCMainProcessServiceImpl → DotNetRuntimeHelper.AddEnvironment(psi)

而 DotNetRuntimeHelper.GetDotNetRoot() 优先读取环境变量 DOTNET_ROOT,
再用 psi.Environment.TryAdd("DOTNET_ROOT", 值) 传给子进程:

static string? GetDotNetRoot()
{
    var value = Environment.GetEnvironmentVariable("DOTNET_ROOT");   // ← 优先环境变量
    if (string.IsNullOrWhiteSpace(value))
    {
        var location = typeof(object).Assembly.Location;             // ← 实际运行时(正确的)
        value = Path.GetFullPath(Path.Combine(location, "..", "..", "..", ".."));
    }
    return value;
}

本机 DOTNET_ROOT 指向 C:\Program Files\dotnet(没有 .NET 11),
加速组件的 apphost 因此忽略安装目录自带的 dotnet\,直接报找不到框架并退出,
主程序等不到 IPC 连接,就显示「无法连接加速服务」。

3.1.0 没暴露这个问题的原因是它的 runtimeconfig 要求 .NET 10.0,
系统里的 10.0.9 可以 roll-forward;3.2.0 升到 11.0.0-rc.3 后就找不到匹配版本了。

证据

1)COREHOST 跟踪(COREHOST_TRACE=1,直接运行 3.2 的加速组件)

Using environment variable DOTNET_ROOT=[C:\Program Files\dotnet] as runtime location.
Attempting to read runtime config: ...\modules\Accelerator\Steam++.Accelerator.runtimeconfig.json
--- The specified framework 'Microsoft.NETCore.App', version '11.0.0-rc.3.26522.148' ...
No match greater than or equal to [11.0.0-rc.3.26522.148] found.
Framework reference didn't resolve to any available version.
It was not possible to find any compatible framework version
You must install or update .NET to run this application.

注意:同目录自带的 dotnet\shared\Microsoft.NETCore.App\11.0.0-rc.3.26522.148 完全没有被搜索。

2)同一组参数手动运行加速组件(pipe 名 + 主进程 PID)

程序 环境 退出码
3.2 Steam++.Accelerator.exe 继承系统 DOTNET_ROOT=C:\Program Files\dotnet -2147450730 (0x80008096) 启动失败
3.2 Steam++.Accelerator.exe DOTNET_ROOT=E:\watt\Steam++\dotnet 4043 正常进入业务逻辑
3.1 Steam++.Accelerator.exe 继承系统 DOTNET_ROOT=C:\Program Files\dotnet 4001 正常进入业务逻辑

3)端到端验证修复方向

用进程级环境变量 DOTNET_ROOT=<安装目录>\dotnet 启动 3.2 主程序后,
Steam++.Accelerator.exe 成功启动并保持运行,网络加速恢复正常,问题不再出现。
(只对本次进程树生效,没有修改系统环境变量。)

建议修复
  1. DotNetRuntimeHelper.GetDotNetRoot() 改为优先使用当前进程实际加载的运行时
    (typeof(object).Assembly.Location 向上四级),DOTNET_ROOT 只作为兜底;
  2. 或者把 TryAdd 改为直接赋值 psi.Environment["DOTNET_ROOT"] = 实际运行时根目录,
    保证加速组件和主程序使用同一套运行时;
  3. 启动 Accelerator 时也可以显式设置 DOTNET_ROOT = <安装目录>\dotnet。
其它建议

3.2.0 出现问题时,%TEMP%\Steam++\Logs 下没有任何新日志(3.1.0 有),
排查时完全没有线索;建议 IPC / 子进程启动失败时把子进程退出码、stdout/stderr
和日志路径带到提示框或日志里,否则「请检查加速组件是否正常启动」这个提示无法定位问题。

环境信息
  • OS: Windows 11 家庭中文版 26200
  • Watt Toolkit: 3.2.0(安装包 FileVersion 3.2.1.0),安装目录 E:\watt\Steam++
  • 系统 .NET(C:\Program Files\dotnet):6.0.36 / 8.0.27 / 9.0.7 / 10.0.9
  • 程序自带 .NET:10.0.3、11.0.0-rc.3.26522.148
  • 机器级环境变量:DOTNET_ROOT=C:\Program Files\dotnet
  • 3.1.0(同一目录、同一配置)完全正常
Lingua principale
C#
Stelle
27.5k
Fork
1.8k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di BeyondDimension/SteamTools

Tutte le issue di BeyondDimension/SteamTools

Issue simili

Altre issue su C#

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.