Files
MRCC/launcher/PCL-CE/PCL.Core/App/Essentials/UpdateService.cs
T
xyou f70b061d1a
CI / Go Backend (push) Canceled after 0s
feat: 项目初始化 + 3D方块世界原型 + AI助搭系统
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器

HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块

Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚

AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
2026-08-08 14:07:56 +08:00

92 lines
3.0 KiB
C#

using System;
using System.Diagnostics;
using System.IO;
using PCL.Core.App.IoC;
using PCL.Core.Utils.Exts;
namespace PCL.Core.App.Essentials;
[LifecycleService(LifecycleState.BeforeLoading)]
public sealed class UpdateService : GeneralService
{
private static LifecycleContext? _context;
private static LifecycleContext Context => _context!;
private UpdateService() : base("update", "更新", false) { _context = ServiceContext; }
public override void Start()
{
var args = Basics.CommandLineArguments;
if (args is not ["update", _, _, _, _])
{
switch (args)
{
case ["update_finished", _]:
{
var toDelete = args[1];
File.Delete(toDelete);
Context.Debug("更新来源文件已删除");
break;
}
case ["update_failed", _]:
{
var reason = args[1];
Context.Error(
$"更新失败: {reason}\n你可以手动将 exe 文件替换为 PCL 目录中的新版本" +
$"或再次尝试更新,若再次尝试仍然失败,请尽快反馈这个问题");
break;
}
default: Context.Debug("无更新任务"); break;
}
Context.DeclareStopped();
return;
}
try
{
Context.Info("开始更新");
Lifecycle.PendingLogDirectory = Path.Combine(Basics.ExecutableDirectory, "Log");
Lifecycle.PendingLogFileName = "LastPending_Update.log";
var oldProcessId = args[1].Convert<int>();
Context.Debug($"旧版本进程 ID: {oldProcessId}");
try
{
var oldProcess = Process.GetProcessById(oldProcessId);
Context.Debug("正在等待旧版本进程退出");
oldProcess.WaitForExit();
Context.Trace("旧版本进程已退出");
}
catch
{
/* ignored */
}
Context.Debug("正在替换文件");
var target = args[2];
Context.Trace($"目标: {target}");
var source = args[3];
Context.Trace($"来源: {source}");
var ex = UpdateHelper.Replace(source, target);
if (ex is null) Context.Trace("替换完成");
else Context.Error("替换文件出错", ex);
var restart = args[4].Convert<bool>();
if (restart)
{
var restartArgs = (ex is null) ? $"finished \"{source}\"" : $"failed \"{ex.Message}\"";
restartArgs = $"update_{restartArgs}";
Context.Debug($"重启中,使用参数: {restartArgs}");
Process.Start(target, restartArgs);
}
}
catch (Exception ex)
{
Context.Error("更新过程出错", ex);
}
Context.RequestExit();
}
}