diff --git a/LanMountainDesktop.Launcher/Services/DeploymentLocator.cs b/LanMountainDesktop.Launcher/Services/DeploymentLocator.cs
index 81e041b..15e4c85 100644
--- a/LanMountainDesktop.Launcher/Services/DeploymentLocator.cs
+++ b/LanMountainDesktop.Launcher/Services/DeploymentLocator.cs
@@ -1,4 +1,4 @@
-using System.Globalization;
+using System.Globalization;
using System.Text.Json;
using LanMountainDesktop.Launcher.Models;
using LanMountainDesktop.Shared.Contracts.Launcher;
@@ -360,51 +360,59 @@ internal sealed class DeploymentLocator
///
private static string? ScanDevelopmentPaths(string executable)
{
+ var solutionRoot = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", ".."));
+
var possiblePaths = new[]
{
- // 浠?Launcher 椤圭洰杩愯
+ // 标准开发路径:解决方案根目录下的 LanMountainDesktop 项目
+ Path.Combine(solutionRoot, "LanMountainDesktop", "bin", "Debug", "net10.0", executable),
+ Path.Combine(solutionRoot, "LanMountainDesktop", "bin", "Release", "net10.0", executable),
+
+ // 向后兼容
Path.Combine(AppContext.BaseDirectory, "..", "..", "LanMountainDesktop", "bin", "Debug", "net10.0", executable),
Path.Combine(AppContext.BaseDirectory, "..", "..", "LanMountainDesktop", "bin", "Release", "net10.0", executable),
- // 浠庤В鍐虫柟妗堟牴鐩綍杩愯
- Path.Combine(AppContext.BaseDirectory, "..", "LanMountainDesktop", "bin", "Debug", "net10.0", executable),
- Path.Combine(AppContext.BaseDirectory, "..", "LanMountainDesktop", "bin", "Release", "net10.0", executable),
-
- // dev-test 鐩綍
- Path.Combine(AppContext.BaseDirectory, "..", "dev-test", "app-1.0.0-dev", executable),
+ // dev-test 目录
+ Path.Combine(solutionRoot, "dev-test", "app-1.0.0-dev", executable),
};
foreach (var path in possiblePaths.Select(Path.GetFullPath).Distinct())
{
+ Logger.Info($"Scanning development path: {path}");
if (File.Exists(path))
{
+ Logger.Info($"Found host at: {path}");
return path;
}
}
return null;
- }
-
+ }
+
///
- /// 鑾峰彇寮€鍙戠幆澧冨彲鑳界殑涓荤▼搴忚矾寰? ///
+ /// 鑾峰彇寮€鍙戞ā寮忥細鏌ユ壘涓荤▼搴忚経
+ ///
private static IEnumerable GetDevelopmentPaths(string executable)
{
var launcherDir = AppContext.BaseDirectory;
+ // 计算解决方案根目录:从 LanMountainDesktop.Launcher\bin\Debug\net10.0\ 向上4级
+ var solutionRoot = Path.GetFullPath(Path.Combine(launcherDir, "..", "..", "..", ".."));
+
var possiblePaths = new[]
{
- // 浠?Launcher 椤圭洰杩愯锛?.\LanMountainDesktop\bin\Debug\net10.0\LanMountainDesktop.exe
+ // 标准开发路径:解决方案根目录下的 LanMountainDesktop 项目
+ Path.Combine(solutionRoot, "LanMountainDesktop", "bin", "Debug", "net10.0", executable),
+ Path.Combine(solutionRoot, "LanMountainDesktop", "bin", "Release", "net10.0", executable),
+
+ // 向后兼容:如果 Launcher 在特殊目录结构中
Path.Combine(launcherDir, "..", "..", "LanMountainDesktop", "bin", "Debug", "net10.0", executable),
Path.Combine(launcherDir, "..", "..", "LanMountainDesktop", "bin", "Release", "net10.0", executable),
- // 浠庤В鍐虫柟妗堟牴鐩綍杩愯锛歀anMountainDesktop\bin\Debug\net10.0\LanMountainDesktop.exe
- Path.Combine(launcherDir, "..", "LanMountainDesktop", "bin", "Debug", "net10.0", executable),
- Path.Combine(launcherDir, "..", "LanMountainDesktop", "bin", "Release", "net10.0", executable),
-
- // 浠?dev-test 鐩綍杩愯
- Path.Combine(launcherDir, "..", "dev-test", "app-1.0.0-dev", executable),
+ // dev-test 目录
+ Path.Combine(solutionRoot, "dev-test", "app-1.0.0-dev", executable),
};
-
+
return possiblePaths.Select(Path.GetFullPath).Distinct();
}
diff --git a/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.cs b/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.cs
index fc49cbd..a17558b 100644
--- a/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.cs
+++ b/LanMountainDesktop.Launcher/Services/LauncherFlowCoordinator.cs
@@ -955,7 +955,7 @@ internal sealed class LauncherFlowCoordinator
{
try
{
- await splashWindow.DismissAsync().ConfigureAwait(false);
+ await Dispatcher.UIThread.InvokeAsync(() => splashWindow.DismissAsync());
}
catch (Exception ex)
{
diff --git a/LanMountainDesktop.Launcher/Views/SplashWindow.axaml.cs b/LanMountainDesktop.Launcher/Views/SplashWindow.axaml.cs
index 1657024..d6b91db 100644
--- a/LanMountainDesktop.Launcher/Views/SplashWindow.axaml.cs
+++ b/LanMountainDesktop.Launcher/Views/SplashWindow.axaml.cs
@@ -79,6 +79,14 @@ public partial class SplashWindow : Window, ISplashStageReporter
}
_dismissed = true;
+
+ // 确保在UI线程上执行
+ if (!Dispatcher.UIThread.CheckAccess())
+ {
+ await Dispatcher.UIThread.InvokeAsync(async () => await DismissAsync());
+ return;
+ }
+
ConfigureForVisualMode();
if (_mode == StartupVisualMode.SlideSplash)
@@ -91,13 +99,7 @@ public partial class SplashWindow : Window, ISplashStageReporter
await AnimateOpacityAsync(Opacity, 0d, FadeAnimationDuration).ConfigureAwait(false);
}
- await Dispatcher.UIThread.InvokeAsync(() =>
- {
- if (IsVisible)
- {
- Close();
- }
- });
+ Close();
}
public void Report(string stage, string message)