using Microsoft.Win32;
using SWRIS.Core;
using SWRIS.Extensions;
using SWRIS.Models;
using SWRIS.Properties;
using SWRIS.Services;
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.SelfHost;
using System.Windows;
using System.Windows.Threading;
namespace SWRIS
{
///
/// App.xaml 的交互逻辑
///
public partial class App : Application
{
public static ConfigModel Config { get; set; }
public static TcpServerFrame TcpServer { get; set; }
public static CalibrationCore Calibration { get; set; }
public static DataCenterModel DataCenter { get; set; }
public static HistoryCleanupService HistoryCleanup { get; set; }
public App()
{
//首先注册开始和退出事件
if (!Settings.Default.IsDebug)
{
Startup += new StartupEventHandler(App_Startup);
if (!HslCommunication.Authorization.SetAuthorizationCode("946778b1-967c-4e05-beab-7f47bb248b71"))
{
LogHelper.Info("HSL授权失败");
return;
}
}
//PDF初始化配置
QuestPDF.Settings.License = QuestPDF.Infrastructure.LicenseType.Community;
QuestPDF.Settings.CheckIfAllTextGlyphsAreAvailable = false;
}
private void InitSoftAuthorize()
{
if (!SoftAuth.IsAuthorizeSuccess())
{
SoftAuthDialog authDialog = new SoftAuthDialog();
var result = authDialog.ShowDialog();
if (result != true)
{
Environment.Exit(0);
}
}
}
private static SingleInstanceManager _singleInstanceManager;
public static void SwitchToExistingInstance(string processName)
{
_singleInstanceManager?.SwitchToExistingInstance(processName);
}
protected override void OnStartup(StartupEventArgs e)
{
#region 阻止系统睡眠,阻止屏幕关闭。
SystemSleep.PreventForCurrentThread();
#endregion
#region 避免程序多次启动
_singleInstanceManager = new SingleInstanceManager("SWRIS");
// 检查是否已有实例运行
if (_singleInstanceManager.IsAlreadyRunning())
{
// 切换到已有实例
_singleInstanceManager.SwitchToExistingInstance();
Shutdown();
return;
}
#endregion
Config = ConfigHelper.Read();
if (Config == null)
{
LogHelper.Error("读取配置文件失败");
Environment.Exit(0);
}
if (!Tools.CheckIpAddressExists(Config.IpAddress))
{
MessageBox.Show($"当前在用网卡的IP地址中没有发现[{Config.IpAddress}],请检查网络配置", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
Environment.Exit(0);
}
if (Tools.CheckPortInUse(Config.Port))
{
MessageBox.Show("当前配置的端口已被占用,请更换端口或关闭占用该端口的程序", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
Environment.Exit(0);
}
if (Settings.Default.IsDebug)
{
SetAutoStart(false);
}
else
{
InitSoftAuthorize();
SetAutoStart(true);
// 创建桌面快捷方式
Tools.CreateShortcut(Assembly.GetExecutingAssembly().Location, Config.AppName);
}
// 显示启动画面
var splashScreen = new SplashScreen("Resources/loading.png");
splashScreen.Show(false, true);
Task.Run(async () =>
{
SqLiteBaseRepository.CreateDatabase();
//初始化TcpServer
TcpServer = new TcpServerFrame(Config.IpAddress, Config.Port);
//初始化标定模块
Calibration = new CalibrationCore(Config.Calibration);
//初始化数据中心能模块
DataCenter = new DataCenterModel(Config.Equipments, Config.Calibration.Limits);
//初始化清理计划模块
HistoryCleanup = new HistoryCleanupService();
HistoryCleanup.StartScheduledCleanup();
// 数据加载完成后,在UI线程更新
await Current.Dispatcher.InvokeAsync(() =>
{
splashScreen.Close(TimeSpan.FromMilliseconds(200));
var mainWindow = new MainWindow
{
Height = SystemParameters.PrimaryScreenHeight,
Width = SystemParameters.PrimaryScreenWidth
};
mainWindow.Activate();
mainWindow.Show();
});
});
base.OnStartup(e);
}
public static bool UpdateEquipment(EquipmentModel equipment)
{
if (equipment == null) return false;
var existingEquipment = Config.Equipments.FirstOrDefault(e => e.IpAddress == equipment.IpAddress);
if (existingEquipment == null) return false;
// 更新设备信息
Mapping.AssignFrom(existingEquipment, equipment);
return true;
}
private void StartHttpServer()
{
//添加防火墙8002端口允许出站规则
FirewallHelper.CreateTCPOutRule(Assembly.GetEntryAssembly().Location, remotePorts: "8002");
var config = new HttpSelfHostConfiguration($"http://{Tools.GetIpAddress()}:{8002}");
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(name: "DefaultApi",
routeTemplate: "api/{controller}/{action}",
defaults: new { id = RouteParameter.Optional });
new HttpSelfHostServer(config).OpenAsync();
}
private void App_Startup(object sender, StartupEventArgs e)
{
//UI线程未捕获异常处理事件
DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
//Task线程内未捕获异常处理事件
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
//非UI线程未捕获异常处理事件
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
try
{
LogHelper.Error("UI线程异常:" + e.Exception.Message, e.Exception);
}
catch (Exception ex)
{
LogHelper.Error("UI线程异常trycatch:" + ex.Message, ex);
}
finally
{
e.Handled = true;
}
}
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
var exception = e.ExceptionObject as Exception;
if (exception != null)
{
LogHelper.Error("非UI线程发生致命错误", exception);
}
}
catch (Exception ex)
{
LogHelper.Error("非UI线程发生致命错误trycatch", ex);
}
finally
{
//此时程序出现严重异常,将强制结束退出
Current.Shutdown();
Process.Start(ResourceAssembly.Location);//重启软件
}
}
void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
try
{
var exception = e.Exception as Exception;
if (exception != null)
{
LogHelper.Error("Task线程异常:" + exception.Message, exception);
}
}
catch (Exception ex)
{
LogHelper.Error("Task线程异常trycatch:" + ex.Message, ex);
}
finally
{
e.SetObserved();
}
}
///
/// 修改程序在注册表中的键值
///
/// true:开机启动,false:不开机自启
public static void SetAutoStart(bool isAuto, bool showInfo = true)
{
string appName = Config.AppName;
try
{
using (RegistryKey rLocal = Registry.CurrentUser)
using (RegistryKey rRun = rLocal.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true))
{
if (rRun == null) return;
if (isAuto)
{
string currentPath = Process.GetCurrentProcess().MainModule.FileName;
object existingValue = rRun.GetValue(appName);
// 只有当值不存在或路径不同时才更新
if (existingValue == null || !currentPath.Equals(existingValue.ToString(), StringComparison.OrdinalIgnoreCase))
{
rRun.SetValue(appName, currentPath);
}
}
else
{
// 如果存在则删除
if (rRun.GetValue(appName) != null)
{
rRun.DeleteValue(appName, false);
}
}
}
}
catch (UnauthorizedAccessException)
{
if (showInfo)
{
MessageBox.Show("需要管理员权限才能修改开机启动设置", "权限不足");
}
}
catch (Exception ex)
{
if (showInfo)
{
MessageBox.Show($"修改开机启动设置时出错: {ex.Message}", "错误");
}
}
}
public static void RestartApplication()
{
_singleInstanceManager?.Dispose();
// 获取当前进程的可执行文件路径
string currentExecutablePath = Process.GetCurrentProcess().MainModule.FileName;
// 启动新的进程实例
Process.Start(currentExecutablePath);
// 关闭当前应用程序
Current.Shutdown();
}
protected override void OnExit(ExitEventArgs e)
{
TcpServer?.Dispose();
Calibration?.Dispose();
HistoryCleanup?.Dispose();
_singleInstanceManager?.Dispose();
// 恢复此线程曾经阻止的系统休眠和屏幕关闭。
SystemSleep.RestoreForCurrentThread();
base.OnExit(e);
}
}
}