Files
2026-08-04 18:36:40 +08:00

201 lines
7.8 KiB
C#
Raw Permalink 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 JinYuan.Helper;
using JinYuan.VirtualDataLibrary;
using System;
using System.Configuration;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace LargeSquareOne
{
internal static class Program
{
#region 调用系统API
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
private const int SW_MAXIMIZE = 3;
#endregion 调用系统API
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
var stopwatch = Stopwatch.StartNew();
// 添加全局异常处理
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += (sender, e) =>
{
Debug.WriteLine($"[UI线程异常] {e.Exception.Message}");
Debug.WriteLine($"[堆栈] {e.Exception.StackTrace}");
// 检查是否是Max()异常
if (e.Exception is InvalidOperationException &&
e.Exception.Message.Contains("Sequence contains no elements") &&
e.Exception.StackTrace.Contains("Enumerable.Max"))
{
Debug.WriteLine("[诊断] 找到LINQ Max()空集合异常!");
// 输出调用堆栈中的方法名
var stackTrace = new System.Diagnostics.StackTrace(e.Exception, true);
var frames = stackTrace.GetFrames();
if (frames != null)
{
foreach (var frame in frames.Take(5)) // 前5帧
{
var method = frame.GetMethod();
Debug.WriteLine($"[调用链] {method.DeclaringType?.FullName}.{method.Name}");
}
}
}
};
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
var ex = e.ExceptionObject as Exception;
Debug.WriteLine($"[非UI线程异常] {ex?.Message}");
};
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
string strname = Process.GetCurrentProcess().ProcessName;
int a = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Count();
if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Count() > 1)
{
MessageBox.Show("软件已经启动,请在后台确认。");
Thread.Sleep(1000);
Environment.Exit(0);
return;
}
Process instance = GetRunningInstance();
if (instance == null)
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
ClearMemoryHelper.ClearMemory();
ReadConfig();
try
{
{
FrmLogin frm = new FrmLogin();
if (frm.ShowDialog() == DialogResult.OK)
{
Debug.WriteLine($"[启动] 开始加载主窗体: {stopwatch.ElapsedMilliseconds}ms");
var mainForm = new FrmMain();
Debug.WriteLine($"[启动] 主窗体创建完成: {stopwatch.ElapsedMilliseconds}ms");
Application.Run(mainForm);
Debug.WriteLine($"[启动] 应用程序运行: {stopwatch.ElapsedMilliseconds}ms");
}
}
}
catch (Exception ex)
{
MessageBox.Show($"退出异常:{ex.Message}\n{ex.StackTrace}", "退出告警");
}
}
else
{
// 激活以前的实例
HandleRunningInstance(instance);
}
}
/// <summary>
/// 配置,数据库初始化
/// </summary>
public static void ReadConfig()
{
//LogHelper.Instance.InitLog(Application.StartupPath + "\\Logs\\");
LogHelper.Instance.InitLog("D:\\APILog\\Logs\\");
// 读取 XML 文件
CommonMethods.Configxml = CommonMethods.ReadXmlConfig(CommonMethods.xmlFilePath);
string MySlqconnString1 = ConfigurationManager.ConnectionStrings["mysql"].ToString();//本地
string MySlqconnString2 = ConfigurationManager.ConnectionStrings["mysql2"].ToString();//远端
string strDBType = ConfigurationManager.AppSettings["DefaultDb"].ToString();
var connDbType = (SqlSugar.DbType)Enum.Parse(typeof(SqlSugar.DbType), strDBType);
CommonMethods.db.SetConnectionStr(MySlqconnString1, SqlSugar.DbType.MySql);
CommonMethods.dbServer.SetConnectionStr(MySlqconnString2, SqlSugar.DbType.MySql);
CommonMethods.sysConfig.SwipeCardMode = Convert.ToBoolean(CommonMethods.GetConfigValue(CommonMethods.Configxml, "CONFIG_INFO", "EnableCardMode", "false"));//开启刷卡模式?
}
/// <summary>
/// 当某个异常未被捕获时出现,回调方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
Exception ex = e.ExceptionObject as Exception;
if (ex != null)
{
LogHelper.Instance.WriteEX(ex);
if (ex.StackTrace.Contains("Finalize"))
{
LogHelper.Instance.WriteEX($"资源释放异常(Finalizer)", ex);
MessageBox.Show($"资源释放失败:{ex.Message}\n这是退出告警的核心原因!", "关键错误");
}
else
{
LogHelper.Instance.WriteEX($"全局未处理异常 ", ex);
}
}
MessageBox.Show($"程序出现大异常,请联系 【金源自动化软件设计部】。\r\n异常信息: {ex.Message}\r\n异常堆栈:{ex.StackTrace}",
"致命错误", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
/// <summary>
/// 返回正在运行的程序进程
/// </summary>
/// <returns></returns>
public static Process GetRunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
foreach (Process process in processes)
{
if (process.Id != current.Id)
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
return process;
}
return null;
}
/// <summary>
/// 已经有了就把它激活,并将其窗口放置最前端
/// </summary>
/// <param name="instance"></param>
public static void HandleRunningInstance(Process instance)
{
ShowWindowAsync(instance.MainWindowHandle, SW_MAXIMIZE);
SetForegroundWindow(instance.MainWindowHandle);
}
}
}