improve:自动更新

This commit is contained in:
2025-08-30 15:49:37 +08:00
parent 21fa146f6f
commit ea09a3e798
2 changed files with 72 additions and 41 deletions
+49 -35
View File
@@ -76,7 +76,12 @@ namespace Ink_Canvas
InitializeCrashListeners();
// 仅在崩溃后操作为静默重启时才启动看门狗
if (CrashAction == CrashActionType.SilentRestart)
// 在更新模式下不启动看门狗,避免干扰更新流程
args = Environment.GetCommandLineArgs();
bool isUpdateMode = args.Contains("--update-mode");
bool isFinalApp = args.Contains("--final-app");
if (CrashAction == CrashActionType.SilentRestart && !isUpdateMode && !isFinalApp)
{
StartWatchdogIfNeeded();
}
@@ -465,6 +470,16 @@ namespace Ink_Canvas
RootPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
LogHelper.NewLog(string.Format("Ink Canvas Starting (Version: {0})", Assembly.GetExecutingAssembly().GetName().Version));
// 检查是否为最终应用启动(更新后的应用)
bool isFinalApp = e.Args.Contains("--final-app");
bool skipMutexCheck = e.Args.Contains("--skip-mutex-check");
// 记录最终应用启动状态
if (isFinalApp)
{
LogHelper.WriteLogToFile("App | 检测到最终应用启动(更新后的应用)");
}
// 在应用启动时自动释放IACore相关DLL
try
@@ -489,34 +504,6 @@ namespace Ink_Canvas
if (isUpdateMode)
{
LogHelper.WriteLogToFile("App | 检测到更新模式,跳过主窗口显示,保持应用运行");
// 在更新模式下,保持应用程序运行直到更新完成
// 更新任务会在后台运行,完成后会自动启动新版本
// 设置一个定时器来检查更新是否完成
var updateCheckTimer = new Timer(async _ =>
{
try
{
// 检查是否有新的InkCanvasForClass.exe进程启动
var processes = Process.GetProcessesByName("InkCanvasForClass");
if (processes.Length > 1) // 如果有多个进程,说明新版本已启动
{
LogHelper.WriteLogToFile("App | 检测到新版本已启动,退出更新进程");
IsAppExitByUser = true;
Application.Current.Dispatcher.Invoke(() =>
{
Application.Current.Shutdown();
});
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"App | 更新检查定时器出错: {ex.Message}", LogHelper.LogType.Error);
}
}, null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5));
// 在更新模式下,不创建主窗口,但保持应用程序运行
// 通过返回而不创建主窗口来实现
return;
}
@@ -527,7 +514,25 @@ namespace Ink_Canvas
// 检查是否以更新模式启动
isUpdateMode = e.Args.Contains("--update-mode");
if (File.Exists(updateMarkerFile))
// 如果是最终应用启动,立即清理更新标记文件
if (isFinalApp)
{
try
{
if (File.Exists(updateMarkerFile))
{
File.Delete(updateMarkerFile);
LogHelper.WriteLogToFile("App | 最终应用启动,清理更新标记文件");
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"App | 清理更新标记文件失败: {ex.Message}", LogHelper.LogType.Warning);
}
}
// 如果不是最终应用启动,才检查更新标记文件
if (!isFinalApp && File.Exists(updateMarkerFile))
{
try
{
@@ -619,8 +624,8 @@ namespace Ink_Canvas
}
}
// 如果是更新过程更新模式,跳过Mutex检查
if (!isUpdateInProgress && !isUpdateMode)
// 如果是更新过程更新模式、最终应用或跳过Mutex检查,跳过Mutex检查
if (!isUpdateInProgress && !isUpdateMode && !isFinalApp && !skipMutexCheck)
{
bool ret;
mutex = new Mutex(true, "InkCanvasForClass CE", out ret);
@@ -651,17 +656,26 @@ namespace Ink_Canvas
{
LogHelper.WriteLogToFile("App | 更新模式启动,跳过重复运行检测");
}
else if (isFinalApp)
{
LogHelper.WriteLogToFile("App | 最终应用启动,跳过重复运行检测");
}
else if (skipMutexCheck)
{
LogHelper.WriteLogToFile("App | 跳过Mutex检查模式启动,跳过重复运行检测");
}
else
{
LogHelper.WriteLogToFile("App | 更新过程中,跳过重复运行检测");
}
// 在更新过程中,创建一个临时的Mutex以避免其他检查出错
mutex = new Mutex(true, "InkCanvasForClass CE Update", out bool tempRet);
// 在特殊模式下,创建一个临时的Mutex以避免其他检查出错
string mutexName = isFinalApp ? "InkCanvasForClass CE Final" : "InkCanvasForClass CE Update";
mutex = new Mutex(true, mutexName, out bool tempRet);
// 额外等待一小段时间确保更新进程完全退出
Thread.Sleep(1000);
LogHelper.WriteLogToFile("App | 更新等待完成,继续启动");
LogHelper.WriteLogToFile("App | 特殊模式等待完成,继续启动");
}
_taskbar = (TaskbarIcon)FindResource("TaskbarTrayIcon");
+23 -6
View File
@@ -1503,7 +1503,7 @@ namespace Ink_Canvas.Helpers
LogHelper.WriteLogToFile("AutoUpdate | 更新操作完成");
// 启动更新后的应用程序
// 启动更新后的应用程序
string newAppPath = Path.Combine(targetPath, "InkCanvasForClass.exe");
if (File.Exists(newAppPath))
{
@@ -1520,16 +1520,20 @@ namespace Ink_Canvas.Helpers
File.WriteAllText(updateMarkerFile, currentUpdateProcessId.ToString());
LogHelper.WriteLogToFile($"AutoUpdate | 创建更新标记文件: {updateMarkerFile}");
// 启动更新后的应用程序
// 启动更新后的应用程序(标记为最终应用,不受相同进程影响)
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = newAppPath,
Arguments = "--final-app --skip-mutex-check",
WorkingDirectory = targetPath,
UseShellExecute = false
};
Process newProcess = Process.Start(startInfo);
LogHelper.WriteLogToFile($"AutoUpdate | 最终应用程序启动成功,PID: {newProcess?.Id}");
LogHelper.WriteLogToFile($"AutoUpdate | 最终应用程序启动成功,PID: {newProcess?.Id},已标记为最终应用");
// 等待一小段时间确保最终应用程序启动
Thread.Sleep(2000);
// 结束当前更新进程
LogHelper.WriteLogToFile("AutoUpdate | 更新流程完成,结束更新进程");
@@ -1538,9 +1542,22 @@ namespace Ink_Canvas.Helpers
try
{
LogHelper.WriteLogToFile("AutoUpdate | 强制结束更新进程");
Process.GetCurrentProcess().Kill();
// 如果Kill()没有立即生效,使用Environment.Exit强制退出
Thread.Sleep(100);
// 标记为应用主动退出,避免看门狗重启
App.IsAppExitByUser = true;
// 写入退出信号文件,确保看门狗不会重启
try
{
string watchdogExitSignalFile = Path.Combine(Path.GetTempPath(), "icc_watchdog_exit_" + Process.GetCurrentProcess().Id + ".flag");
File.WriteAllText(watchdogExitSignalFile, "exit");
LogHelper.WriteLogToFile("AutoUpdate | 已写入看门狗退出信号文件");
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"AutoUpdate | 写入看门狗退出信号文件失败: {ex.Message}", LogHelper.LogType.Warning);
}
Environment.Exit(0);
}
catch (Exception ex)