462 lines
20 KiB
C#
462 lines
20 KiB
C#
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.PPCalculation;
|
||
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.Info("授权失败");
|
||
//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<MachineRtDataService>();
|
||
containerRegistry.RegisterSingleton<DataRecordService>();
|
||
containerRegistry.RegisterSingleton<HighSpeedDataService>();
|
||
//containerRegistry.RegisterSingleton<PPCService>();
|
||
containerRegistry.RegisterSingleton<SysRunService>();
|
||
|
||
containerRegistry.RegisterSingleton<ComActionService>();
|
||
|
||
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>();
|
||
// 注册干度计算服务(REFPROP 实现)
|
||
containerRegistry.RegisterSingleton<IDrynessCalculator, RefpropDrynessCalculator>();
|
||
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>();
|
||
|
||
|
||
//注册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<DialogCanLinConfigCreateView, DialogCanLinConfigCreateViewModel>();
|
||
containerRegistry.RegisterDialog<DialogPIDConfigView, DialogPIDConfigViewModel>();
|
||
containerRegistry.RegisterDialog<DialogLimitConfigView, DialogLimitConfigViewModel>();
|
||
containerRegistry.RegisterDialog<DialogSuperHeatCoolConfigView, DialogSuperHeatCoolConfigViewModel>();
|
||
containerRegistry.RegisterDialog<DialogLogicRuleView, DialogLogicRuleViewModel>();
|
||
containerRegistry.RegisterDialog<DialogCANSchConfigView, DialogCANSchConfigViewModel>();
|
||
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 appVersionService81 = ContainerLocator.Container.Resolve<CanFdDriveService>();
|
||
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.Info("程序启动");
|
||
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.Info("App-程序退出");
|
||
}
|
||
|
||
|
||
/// <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);
|
||
}
|
||
//MessageBox.Show(sbEx.ToString());
|
||
LogService.Error(sbEx.ToString());
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
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线程内未处理捕获
|
||
//MessageBox.Show("Task线程异常:" + e.Exception.Message);
|
||
LogService.Error($"Task线程异常");
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
HandleException(ex);
|
||
}
|
||
finally
|
||
{
|
||
//设置该异常已察觉(这样处理后就不会引起程序崩溃)
|
||
e.SetObserved();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 公共的日志记录方法
|
||
/// </summary>
|
||
/// <param name="ex"></param>
|
||
private void HandleException(Exception ex)
|
||
{
|
||
//记录日志
|
||
LogService.Error($"App捕捉HandleException-{ex.ToString()}");
|
||
|
||
}
|
||
|
||
|
||
|
||
#endregion
|
||
|
||
|
||
///// <summary>
|
||
///// *******起始弹窗********
|
||
///// </summary>
|
||
//public void Initialization()
|
||
//{
|
||
// taskBar = (TaskbarIcon)FindResource("taskBar");
|
||
|
||
//}
|
||
///// <summary>
|
||
///// *******起始弹窗********
|
||
///// </summary>
|
||
//public void Dispose()
|
||
//{
|
||
// taskBar?.Dispose();
|
||
//}
|
||
}
|
||
|
||
}
|