Files
CapMachine/CapMachine.Wpf/App.xaml.cs
2026-05-08 15:48:49 +08:00

471 lines
20 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using AutoMapper;
using CapMachine.Core;
using CapMachine.Core.IService;
using CapMachine.Wpf.MapperProfile;
using CapMachine.Wpf.Models;
using CapMachine.Wpf.Services;
using CapMachine.Wpf.SoftAuthorizeCore;
using CapMachine.Wpf.ViewModels;
using CapMachine.Wpf.Views;
using FreeSql;
using FreeSql.Internal;
using Hardcodet.Wpf.TaskbarNotification;
using Prism.DryIoc;
using Prism.Ioc;
using Prism.Regions;
using System.Globalization;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
namespace CapMachine.Wpf
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : PrismApplication
{
private TaskbarIcon taskBar;
/// <summary>
/// 日志服务
/// </summary>
private ILogService LogService { get; set; }
private static System.Threading.Mutex mutex;
private SoftAuthorizeHelper SoftAuthorizeHelper { get; set; } = SoftAuthorizeHelper.GetInstance();
public App()
{
try
{
//24.2.7
//Syncfusion.SfSkinManager.SfSkinManager.ApplyStylesOnApplication = true;
Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("MzEyMzM3NkAzMjM0MmUzMDJlMzBHdjVKNUNpNWZxYXQwR05ZbVYvUEtzbGxXMnVxRjYvRGtLSlZUOGpjQW44PQ==");
//System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
// 授权 a717c797-59e3-48de-b6b4-574a4e03dc79
if (!HslCommunication.Authorization.SetAuthorizationCode("b23b00e2-ce46-4bfc-b33c-71c47c2c11c2"))
{
//active failed
MessageBox.Show("授权失败当前程序只能使用8小时");
//return;
}
else
{
//IsActive = true;
}
//SfSkinManager.ApplyStylesOnApplication = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
protected override void OnStartup(StartupEventArgs e)
{
//首先注册开始和退出事件
this.Startup += new StartupEventHandler(App_Startup);
this.Exit += new ExitEventHandler(App_Exit);
mutex = new System.Threading.Mutex(true, "OnlyRun_CRNS");
if (mutex.WaitOne(0, false))
{
base.OnStartup(e);
}
else
{
MessageBox.Show("程序已经在运行!", "提示");
this.Shutdown();
}
//验证文档
try
{
var MachineCode = SoftAuthorizeHelper.GetMachineCode();
SoftAuthorizeHelper.WriteMachineCodeToFile(MachineCode, "");
var PublicKey = SoftAuthorizeHelper.GetPublicKeyDataByFilePath("");
var Lience = SoftAuthorizeHelper.GetLienceDataByFilePath("");
var IsOK = SoftAuthorizeHelper.CheckLience(MachineCode, PublicKey, Lience);
if (!IsOK)
{
LogService.Error("授权失败");
//this.Shutdown();
}
}
catch (Exception ex)
{
throw;
}
//base.OnStartup(e);
}
protected override Window CreateShell() => null;
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
////注册日志服务
containerRegistry.RegisterSingleton<ILogService, LogService>();
//注册AutoMapper 将IAutoMapperProvider注入IOC容器并对外提供IMapper注入类型。
containerRegistry.RegisterSingleton<IMapperProvider, MapperConfig>();
containerRegistry.Register(typeof(IMapper), GetMapper);
//注册基础的服务
//containerRegistry.RegisterSingleton<IHostDialogService, DialogHostService>();
//containerRegistry.RegisterSingleton<IAppStartService, AppStartService>();
//containerRegistry.RegisterSingleton<IApplicationContext, ApplicationContext>();
containerRegistry.RegisterSingleton<LogicRuleService>();
containerRegistry.RegisterSingleton<ConfigService>();
containerRegistry.RegisterSingleton<AlarmService>();
////注册设备服务
//containerRegistry.RegisterSingleton<MachineDataService>();
containerRegistry.RegisterSingleton<CanDriveService>();
containerRegistry.RegisterSingleton<CanFdDriveService>();
containerRegistry.RegisterSingleton<LinDriveService>();
containerRegistry.RegisterSingleton<ZlgCanDriveService>();
containerRegistry.RegisterSingleton<ZlgLinDriveService>();
containerRegistry.RegisterSingleton<MachineRtDataService>();
containerRegistry.RegisterSingleton<DataRecordService>();
containerRegistry.RegisterSingleton<HighSpeedDataService>();
//containerRegistry.RegisterSingleton<PPCService>();
containerRegistry.RegisterSingleton<SysRunService>();
containerRegistry.RegisterSingleton<ComActionService>();
containerRegistry.RegisterSingleton<CanLinConfigImExportService>();
containerRegistry.RegisterSingleton<ProRuntimeService>();
string strsqllite = System.AppDomain.CurrentDomain.BaseDirectory + @"Db\CapMachine.db";
string strslocaldb = System.AppDomain.CurrentDomain.BaseDirectory + @"Db\CapMachineDb";
//string assemblyPath = Assembly.GetExecutingAssembly().Location;
var Con = ConfigHelper.GetValue("connecting5").Replace("@Address@", strsqllite);
var LocalDb = @"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=@Address@.mdf;Integrated Security=True;Connect Timeout=30;";
var LocalDbStr = LocalDb.Replace("@Address@", strslocaldb);
var LocalDbDir = @"Data Source=(localdb)\MSSQLLocalDB;Integrated Security=True;Connect Timeout=30;";
//var LocalDbFath= @"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=@Address@.mdf;Integrated Security=True;Connect Timeout=30;".Replace("@Address@", ConfigHelper.GetValue("LocalDBPath"));
var Constr = ConfigHelper.GetValue("connecting");
//注册IFreeSql实例 单例
containerRegistry.RegisterSingleton<IFreeSql>(() =>
{
IFreeSql Fsql = new FreeSqlBuilder()
//.UseConnectionString(DataType.SqlServer, "Data Source=CT-PC;user instance=false;Initial Catalog=KylinEMS;Encrypt=True;TrustServerCertificate=True;User ID=sa;Password=12345678")
//.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=CT-PC;user instance=false;Initial Catalog=CapMachine;Encrypt=True;TrustServerCertificate=True;User ID=sa;Password=12345678")
.UseConnectionString(FreeSql.DataType.SqlServer, Constr)
//.UseConnectionString(FreeSql.DataType.SqlServer, LocalDbDir)
//.UseConnectionString(FreeSql.DataType.Sqlite, Con)
.UseAutoSyncStructure(true)
.Build();
return Fsql;
});
containerRegistry.RegisterSingleton<INavigationMenuService, NavigationMenuService>();
containerRegistry.RegisterForNavigation<MainView, MainViewModel>();
containerRegistry.RegisterForNavigation<MonitorView, MonitorViewModel>();
containerRegistry.RegisterForNavigation<ProConfigView, ProConfigViewModel>();
containerRegistry.RegisterForNavigation<RealTimeChartView, RealTimeChartViewModel>();
containerRegistry.RegisterForNavigation<UserManageView, UserManageViewModel>();
containerRegistry.RegisterForNavigation<ActionLogView, ActionLogViewModel>();
containerRegistry.RegisterForNavigation<FooterView, FooterViewModel>();
containerRegistry.RegisterForNavigation<ProStepConfigPsView, ProStepConfigPsViewModel>();
containerRegistry.RegisterForNavigation<ProStepConfigMainView, ProStepConfigMainViewModel>();
containerRegistry.RegisterForNavigation<QuickMeterStepView, QuickMeterStepViewModel>();
containerRegistry.RegisterForNavigation<HistoryDataView, HistoryDataViewModel>();
containerRegistry.RegisterForNavigation<CANConfigView, CANConfigViewModel>();
containerRegistry.RegisterForNavigation<CANFDConfigView, CANFDConfigViewModel>();
containerRegistry.RegisterForNavigation<LINConfigView, LinConfigViewModel>();
containerRegistry.RegisterForNavigation<ZlgCanDriveConfigView, ZlgCanDriveConfigViewModel>();
containerRegistry.RegisterForNavigation<ZlgLinDriveConfigView, ZlgLinDriveConfigViewModel>();
//注册Dialog视图时绑定VM
containerRegistry.RegisterDialog<DialogCreateProView, DialogCreateProViewModel>();
containerRegistry.RegisterDialog<DialogEditProView, DialogEditProViewModel>();
containerRegistry.RegisterDialog<DialogChartRtConfigView, DialogChartRtConfigViewModel>();
containerRegistry.RegisterDialog<DialogMeterCycleCountView, DialogMeterCycleCountViewModel>();
containerRegistry.RegisterDialog<DialogChartGroupTabView, DialogChartGroupTabViewModel>();
containerRegistry.RegisterDialog<DialogYAxisConfigView, DialogYAxisConfigViewModel>();
containerRegistry.RegisterDialog<DialogHistoryChartRtConfigView, DialogHistoryChartRtConfigViewModel>();
containerRegistry.RegisterDialog<DialogExpInfoView, DialogExpInfoViewModel>();
containerRegistry.RegisterDialog<DialogUserView, DialogUserViewModel>();
containerRegistry.RegisterDialog<DialogCanRwConfigView, DialogCanRwConfigViewModel>();
containerRegistry.RegisterDialog<DialogZlgCanLinRwConfigView, DialogZlgCanLinRwConfigViewModel>();
containerRegistry.RegisterDialog<DialogCanLinConfigCreateView, DialogCanLinConfigCreateViewModel>();
containerRegistry.RegisterDialog<DialogPIDConfigView, DialogPIDConfigViewModel>();
containerRegistry.RegisterDialog<DialogLimitConfigView, DialogLimitConfigViewModel>();
containerRegistry.RegisterDialog<DialogSuperHeatCoolConfigView, DialogSuperHeatCoolConfigViewModel>();
containerRegistry.RegisterDialog<DialogLogicRuleView, DialogLogicRuleViewModel>();
containerRegistry.RegisterDialog<DialogCanLinConfigImExportView, DialogCanLinConfigImExportViewModel>();
containerRegistry.RegisterDialog<DialogCANFdSchConfigView, DialogCANFdSchConfigViewModel>();
containerRegistry.RegisterDialog<DialogCANSchConfigView, DialogCANSchConfigViewModel>();
containerRegistry.RegisterDialog<DialogZlgCANSchConfigView, DialogZlgCANSchConfigViewModel>();
containerRegistry.RegisterDialog<DialogZlgCANFDSchConfigView, DialogZlgCANFDSchConfigViewModel>();
containerRegistry.RegisterDialog<DialogLINSchConfigView, DialogLINSchConfigViewModel>();
containerRegistry.RegisterDialog<SplashScreenView, SplashScreenViewModel>();
//注册AutoMapper
//containerRegistry.RegisterSingleton<IAutoMapperProvider, AutoMapperProvider>();
//containerRegistry.Register(typeof(IMapper), GetMapper);
}
//private IMapper GetMapper(IContainerProvider container)
//{
// var provider = container.Resolve<IAutoMapperProvider>();
// return provider.GetMapper();
//}
/// <summary>
/// 将IAutoMapperProvider注入IOC容器并对外提供IMapper注入类型。
/// </summary>
/// <param name="container"></param>
/// <returns></returns>
private IMapper GetMapper(IContainerProvider container)
{
var provider = container.Resolve<IMapperProvider>();
return provider.GetMapper();
}
/// <summary>
/// 系统初始化
/// </summary>
protected override void OnInitialized()
{
//初始加载资源的窗口 *******起始弹窗********
//var appStart = ContainerLocator.Container.Resolve<IAppStartService>();
//appStart.CreateShell();
//#region 初版
//Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");
//从容器中获取MainView的实例对象
var container = ContainerLocator.Container;
var shell = container.Resolve<object>("MainView");
//加载种子数据
var SeekData = new SeekData(container.Resolve<IFreeSql>());
if (shell is Window view)
{
//更新Prism注册区域信息
var regionManager = container.Resolve<IRegionManager>();
RegionManager.SetRegionManager(view, regionManager);
RegionManager.UpdateRegions();
//给MainView的MainViewFooterContentRegion区域设置FooterView具体的信息
regionManager.RequestNavigate("MainViewFooterContentRegion", nameof(FooterView));
regionManager.RequestNavigate("MainViewContentRegion", nameof(MonitorView));
//调用首页的INavigationAware 接口做一个初始化操作
if (view.DataContext is INavigationAware navigationAware)
{
navigationAware.OnNavigatedTo(null);
//呈现首页
App.Current.MainWindow = view;
}
}
//先加载服务防止在ViewModel中使用时速度慢
var appVersionService = ContainerLocator.Container.Resolve<IFreeSql>();
var appVersionService2 = ContainerLocator.Container.Resolve<ILogService>();
var appVersionService12 = ContainerLocator.Container.Resolve<AlarmService>();
var appVersionService3 = ContainerLocator.Container.Resolve<MachineRtDataService>();
var appVersionService4 = ContainerLocator.Container.Resolve<ProStepConfigPsView>();
var appVersionService5 = ContainerLocator.Container.Resolve<ProConfigView>();
var appVersionService6 = ContainerLocator.Container.Resolve<HistoryDataView>();
var appVersionService7 = ContainerLocator.Container.Resolve<RealTimeChartView>();
var appVersionService8 = ContainerLocator.Container.Resolve<CanDriveService>();
var appVersionService9 = ContainerLocator.Container.Resolve<DataRecordService>();
var appVersionService10 = ContainerLocator.Container.Resolve<HighSpeedDataService>();
//var appVersionService11 = ContainerLocator.Container.Resolve<PPCService>();
var appVersionService15 = ContainerLocator.Container.Resolve<ComActionService>();
var appVersionService16 = ContainerLocator.Container.Resolve<ProRuntimeService>();
//给当前的全局异常捕捉服务使用
LogService = ContainerLocator.Container.Resolve<ILogService>();
LogService.Error("Start-->OnInitialized");
base.OnInitialized();
//#endregion
//*******起始弹窗 * *******
//LogService = ContainerLocator.Container.Resolve<ILogService>();
//LogService.Error("Start-->");
//base.OnInitialized();
}
#region
void App_Startup(object sender, StartupEventArgs e)
{
//UI线程未捕获异常处理事件 UI主线程
this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
//Task线程内未捕获异常处理事件
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
//非UI线程未捕获异常处理事件 (例如自己创建的一个子线程)
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
void App_Exit(object sender, ExitEventArgs e)
{
//程序退出时需要处理的业务
LogService.Error($"程序退出:{e.ToString()}");
}
/// <summary>
/// UI线程未捕获异常处理事件UI主线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//此时程序出现严重异常,将强制结束退出
try
{
HandleException(e.Exception);
//MessageBox.Show("UI线程异常:" + e.Exception.Message);
LogService.Error("UI线程异常:" + e.Exception.Message);
}
catch (Exception ex)
{
HandleException(ex);
//MessageBox.Show("UI线程发生致命错误");
LogService.Error("UI线程发生致命错误");
}
finally
{
e.Handled = true;
}
}
/// <summary>
/// 非UI线程未捕获异常处理事件(例如自己创建的一个子线程)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
var exception = e.ExceptionObject as Exception;
if (exception != null)
{
HandleException(exception);
StringBuilder sbEx = new StringBuilder();
if (e.IsTerminating)
{
sbEx.Append("非UI线程发生致命错误");
}
sbEx.Append("非UI线程异常");
if (e.ExceptionObject is Exception)
{
sbEx.Append(((Exception)e.ExceptionObject).Message);
}
else
{
sbEx.Append(e.ExceptionObject);
}
LogService.Error(sbEx.ToString());
//MessageBox.Show(sbEx.ToString());
}
}
catch (Exception ex)
{
LogService.Error(ex.ToString());
HandleException(ex);
}
finally
{
//ignore
}
}
/// <summary>
/// Task线程内未捕获异常处理事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
try
{
var exception = e.Exception as Exception;
if (exception != null)
{
HandleException(exception);
//task线程内未处理捕获
LogService.Error($"Task线程异常" + e.Exception.Message);
//MessageBox.Show("Task线程异常" + e.Exception.Message);
}
}
catch (Exception ex)
{
HandleException(ex);
}
finally
{
//设置该异常已察觉(这样处理后就不会引起程序崩溃)
e.SetObserved();
}
}
/// <summary>
/// 公共的日志记录方法
/// </summary>
/// <param name="ex"></param>
private void HandleException(Exception ex)
{
//记录日志
LogService.Error(ex.ToString());
}
#endregion
///// <summary>
///// *******起始弹窗********
///// </summary>
//public void Initialization()
//{
// taskBar = (TaskbarIcon)FindResource("taskBar");
//}
///// <summary>
///// *******起始弹窗********
///// </summary>
//public void Dispose()
//{
// taskBar?.Dispose();
//}
}
}