新生命码神工具,代码生成、网络工具、API工具、串口工具、正则工具、图标工具、加解密工具、地图接口。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
4.4 KiB

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using NewLife;
using NewLife.Log;
using NewLife.Net;
using NewLife.Threading;
using NewLife.Xml;
using XCode.DataAccessLayer;
using System.Threading.Tasks;
#if !NET4
using Stardust;
#endif
namespace XCoder
{
static class Program
{
/// <summary>应用程序的主入口点。</summary>
[STAThread]
static void Main()
{
#if NET5_0_OR_GREATER
XTrace2.UseWinForm();
Application.SetHighDpiMode(HighDpiMode.SystemAware);
#else
XTrace.UseWinForm();
#endif
MachineInfo.RegisterAsync();
#if !NET4
StartClient();
#endif
StringHelper.EnableSpeechTip = XConfig.Current.SpeechTip;
if (XConfig.Current.IsNew) "学无先后达者为师,欢迎使用新生命码神工具!".SpeechTip();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmMDI());
}
#if !NET4
static TimerX _timer;
static StarClient _Client;
//static ServiceManager _Manager;
private static void StartClient()
{
var set = XConfig.Current;
var server = set.Server;
if (server.IsNullOrEmpty()) return;
XTrace.WriteLine("初始化服务端地址:{0}", server);
var client = new StarClient(server)
{
Code = set.Code,
Secret = set.Secret,
Log = XTrace.Log,
};
// 登录后保存证书
client.OnLogined += (s, e) =>
{
var inf = client.Info;
if (inf != null && !inf.Code.IsNullOrEmpty())
{
set.Code = inf.Code;
set.Secret = inf.Secret;
set.Save();
}
};
client.UseTrace();
Application.ApplicationExit += (s, e) => client.Logout("ApplicationExit");
// 可能需要多次尝试
_timer = new TimerX(TryConnectServer, client, 0, 5_000) { Async = true };
_Client = client;
}
private static async Task TryConnectServer(Object state)
{
var client = state as StarClient;
var set = XConfig.Current;
await client.Login();
await CheckUpgrade(client, set.Channel);
// 登录成功,销毁定时器
//TimerX.Current.Period = 0;
_timer.TryDispose();
_timer = null;
}
private static String _lastVersion;
private static async Task CheckUpgrade(StarClient client, String channel)
{
var ug = new Stardust.Web.Upgrade { Log = XTrace.Log };
// 检查更新
var ur = await client.Upgrade(channel);
if (ur != null && ur.Version != _lastVersion)
{
ug.Url = ur.Source;
await ug.Download();
// 检查文件完整性
if (ur.FileHash.IsNullOrEmpty() || ug.CheckFileHash(ur.FileHash))
{
// 执行更新,解压缩覆盖文件
var rs = ug.Update();
if (rs && !ur.Executor.IsNullOrEmpty()) ug.Run(ur.Executor);
_lastVersion = ur.Version;
// 去除多余入口文件
ug.Trim("StarAgent");
// 强制更新时,马上重启
if (rs && ur.Force)
{
//StopWork("Upgrade");
// 重新拉起进程
var star = "XCoder.exe";
XTrace.WriteLine("强制升级,拉起进程 {0} -upgrade", star.GetFullPath());
Process.Start(star.GetFullPath(), "-upgrade");
//var p = Process.GetCurrentProcess();
//p.Close();
//p.Kill();
Application.Exit();
}
}
}
}
#endif
}
}