refactor(startup): expose legacy process lifecycle
This commit is contained in:
@@ -15,27 +15,92 @@ using Lskj.Util;
|
|||||||
|
|
||||||
namespace Lskj.Main.Hosting
|
namespace Lskj.Main.Hosting
|
||||||
{
|
{
|
||||||
|
public sealed class LegacyProcessStartResult
|
||||||
|
{
|
||||||
|
internal LegacyProcessStartResult(
|
||||||
|
bool shouldRunApplication,
|
||||||
|
int exitCode)
|
||||||
|
{
|
||||||
|
ShouldRunApplication = shouldRunApplication;
|
||||||
|
ExitCode = exitCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ShouldRunApplication { get; private set; }
|
||||||
|
|
||||||
|
public int ExitCode { get; private set; }
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 为独立的新启动程序公开原 Ls_ERP 初始化和登录流程。
|
/// 为独立的新启动程序公开原 Ls_ERP 初始化和登录流程。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class LegacyApplicationHost
|
public static class LegacyApplicationHost
|
||||||
{
|
{
|
||||||
public static void Run(string[] args, IExternalMainShell externalMainShell)
|
private static readonly object ProcessSync = new object();
|
||||||
{
|
private static bool _mainProcessInitializationStarted;
|
||||||
if (externalMainShell == null)
|
private static bool _mainProcessInitialized;
|
||||||
throw new ArgumentNullException("externalMainShell");
|
private static bool _mainProcessShutdown;
|
||||||
if (Manager.ExternalMainShell != null)
|
|
||||||
throw new InvalidOperationException("旧程序已经由另一个外部主界面托管。");
|
|
||||||
|
|
||||||
|
public static LegacyProcessStartResult PrepareProcess(string[] args)
|
||||||
|
{
|
||||||
|
int code = Program.PrepareProcess(args ?? new string[0]);
|
||||||
|
return new LegacyProcessStartResult(code == -1, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void InitializeMainProcess(IExternalMainShell externalMainShell)
|
||||||
|
{
|
||||||
|
lock (ProcessSync)
|
||||||
|
{
|
||||||
|
if (_mainProcessInitialized)
|
||||||
|
throw new InvalidOperationException(
|
||||||
|
"旧主进程运行时已经初始化。");
|
||||||
|
if (_mainProcessShutdown)
|
||||||
|
throw new InvalidOperationException(
|
||||||
|
"旧主进程运行时已经关闭。");
|
||||||
|
|
||||||
|
_mainProcessInitializationStarted = true;
|
||||||
Manager.ExternalMainShell = externalMainShell;
|
Manager.ExternalMainShell = externalMainShell;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Program.RunFromExternalHost(args);
|
Program.InitializeMainProcess();
|
||||||
|
_mainProcessInitialized = true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Program.ShutdownMainProcess();
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
_mainProcessShutdown = true;
|
||||||
Manager.ExternalMainShell = null;
|
Manager.ExternalMainShell = null;
|
||||||
}
|
}
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShutdownMainProcess()
|
||||||
|
{
|
||||||
|
lock (ProcessSync)
|
||||||
|
{
|
||||||
|
if (!_mainProcessInitializationStarted ||
|
||||||
|
_mainProcessShutdown)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Program.ShutdownMainProcess();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_mainProcessInitialized = false;
|
||||||
|
_mainProcessShutdown = true;
|
||||||
|
Manager.ExternalMainShell = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+158
-48
@@ -21,11 +21,22 @@ using System.Resources;
|
|||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Resources;
|
using System.Resources;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using Lskj.Main.Hosting;
|
||||||
|
|
||||||
namespace Lskj.Main
|
namespace Lskj.Main
|
||||||
{
|
{
|
||||||
static class Program
|
static class Program
|
||||||
{
|
{
|
||||||
|
private static CefMainArgs _mainArgs;
|
||||||
|
private static DemoCefApp _cefApp;
|
||||||
|
private static CefSettings _cefSettings;
|
||||||
|
private static Messager _messageFilter;
|
||||||
|
private static EventHandler _cefIdleHandler;
|
||||||
|
private static AboutDevCompanion _devCompanion;
|
||||||
|
private static bool _cefInitialized;
|
||||||
|
private static bool _mainProcessInitialized;
|
||||||
|
private static bool _mainProcessShutdown;
|
||||||
|
|
||||||
//[DllImport("user32.dll")]
|
//[DllImport("user32.dll")]
|
||||||
//private static extern bool SetProcessDpiAwarenessContext(IntPtr dpiContext);
|
//private static extern bool SetProcessDpiAwarenessContext(IntPtr dpiContext);
|
||||||
|
|
||||||
@@ -36,61 +47,160 @@ namespace Lskj.Main
|
|||||||
/// 应用程序的主入口点。
|
/// 应用程序的主入口点。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main(string[] args)
|
static int Main(string[] args)
|
||||||
{
|
{
|
||||||
//SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
|
LegacyProcessStartResult processResult;
|
||||||
CefRuntime.Load();//cef浏览器模块设置加载
|
try
|
||||||
var mainArgs = new CefMainArgs(args);
|
{
|
||||||
var app = new DemoCefApp();
|
processResult = LegacyApplicationHost.PrepareProcess(args);
|
||||||
var settings = new CefSettings
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
LogHelper.Instance.WriteError(exception);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!processResult.ShouldRunApplication)
|
||||||
|
return processResult.ExitCode;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LegacyApplicationHost.InitializeMainProcess(null);
|
||||||
|
Manager.StartForm();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
MessageUtil.Show(exception);
|
||||||
|
LogHelper.Instance.WriteError(exception);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
LegacyApplicationHost.ShutdownMainProcess();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static int PrepareProcess(string[] args)
|
||||||
|
{
|
||||||
|
if (_mainArgs != null)
|
||||||
|
throw new InvalidOperationException("CEF 进程分流已经执行。");
|
||||||
|
|
||||||
|
CefRuntime.Load();
|
||||||
|
_mainArgs = new CefMainArgs(args ?? new string[0]);
|
||||||
|
_cefApp = new DemoCefApp();
|
||||||
|
_cefSettings = CreateCefSettings();
|
||||||
|
int code = CefRuntime.ExecuteProcess(
|
||||||
|
_mainArgs,
|
||||||
|
_cefApp,
|
||||||
|
IntPtr.Zero);
|
||||||
|
Console.WriteLine(
|
||||||
|
"CefRuntime.ExecuteProcess() returns {0}",
|
||||||
|
code);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void InitializeMainProcess()
|
||||||
|
{
|
||||||
|
if (_mainProcessInitialized)
|
||||||
|
throw new InvalidOperationException("旧主进程环境已经初始化。");
|
||||||
|
if (_mainProcessShutdown)
|
||||||
|
throw new InvalidOperationException("旧主进程环境已经关闭。");
|
||||||
|
if (_mainArgs == null || _cefApp == null || _cefSettings == null)
|
||||||
|
throw new InvalidOperationException("尚未执行 CEF 进程分流。");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CefRuntime.Initialize(
|
||||||
|
_mainArgs,
|
||||||
|
_cefSettings,
|
||||||
|
_cefApp,
|
||||||
|
IntPtr.Zero);
|
||||||
|
_cefInitialized = true;
|
||||||
|
|
||||||
|
Thread.CurrentThread.CurrentUICulture =
|
||||||
|
new CultureInfo("zh-CN");
|
||||||
|
BonusSkins.Register();
|
||||||
|
SkinManager.EnableFormSkins();
|
||||||
|
|
||||||
|
Application.SetUnhandledExceptionMode(
|
||||||
|
UnhandledExceptionMode.CatchException);
|
||||||
|
Application.EnableVisualStyles();
|
||||||
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
_messageFilter = new Messager();
|
||||||
|
Application.AddMessageFilter(_messageFilter);
|
||||||
|
Application.ThreadException += Application_ThreadException;
|
||||||
|
AppDomain.CurrentDomain.UnhandledException +=
|
||||||
|
CurrentDomain_UnhandledException;
|
||||||
|
|
||||||
|
if (!_cefSettings.MultiThreadedMessageLoop)
|
||||||
|
{
|
||||||
|
_cefIdleHandler = delegate
|
||||||
|
{
|
||||||
|
CefRuntime.DoMessageLoopWork();
|
||||||
|
};
|
||||||
|
Application.Idle += _cefIdleHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
_devCompanion = new AboutDevCompanion(1, false);
|
||||||
|
_devCompanion.Run();
|
||||||
|
Register();
|
||||||
|
_mainProcessInitialized = true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
ShutdownMainProcess();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void ShutdownMainProcess()
|
||||||
|
{
|
||||||
|
if (_mainProcessShutdown)
|
||||||
|
return;
|
||||||
|
_mainProcessShutdown = true;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (_cefIdleHandler != null)
|
||||||
|
{
|
||||||
|
Application.Idle -= _cefIdleHandler;
|
||||||
|
_cefIdleHandler = null;
|
||||||
|
}
|
||||||
|
Application.ThreadException -= Application_ThreadException;
|
||||||
|
AppDomain.CurrentDomain.UnhandledException -=
|
||||||
|
CurrentDomain_UnhandledException;
|
||||||
|
if (_messageFilter != null)
|
||||||
|
{
|
||||||
|
Application.RemoveMessageFilter(_messageFilter);
|
||||||
|
_messageFilter = null;
|
||||||
|
}
|
||||||
|
if (_devCompanion != null)
|
||||||
|
{
|
||||||
|
_devCompanion.Stop();
|
||||||
|
_devCompanion = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (_cefInitialized)
|
||||||
|
{
|
||||||
|
CefRuntime.Shutdown();
|
||||||
|
_cefInitialized = false;
|
||||||
|
}
|
||||||
|
_mainProcessInitialized = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static CefSettings CreateCefSettings()
|
||||||
|
{
|
||||||
|
return new CefSettings
|
||||||
{
|
{
|
||||||
MultiThreadedMessageLoop = true,
|
MultiThreadedMessageLoop = true,
|
||||||
LogSeverity = CefLogSeverity.Disable,
|
LogSeverity = CefLogSeverity.Disable,
|
||||||
LogFile = "CefGlue.log",
|
LogFile = "CefGlue.log",
|
||||||
Locale = "zh-CN"
|
Locale = "zh-CN"
|
||||||
};
|
};
|
||||||
try
|
|
||||||
{
|
|
||||||
var Code = CefRuntime.ExecuteProcess(mainArgs, app, IntPtr.Zero);
|
|
||||||
Console.WriteLine("CefRuntime.ExecuteProcess() returns {0}", Code);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
CefRuntime.Initialize(mainArgs, settings, app, IntPtr.Zero);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// 汉化DevExpress界面
|
|
||||||
Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");
|
|
||||||
// 设置皮肤
|
|
||||||
BonusSkins.Register();
|
|
||||||
SkinManager.EnableFormSkins();
|
|
||||||
|
|
||||||
//处理未捕获的异常
|
|
||||||
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
|
|
||||||
Application.EnableVisualStyles();
|
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
|
||||||
Application.AddMessageFilter(new Messager());
|
|
||||||
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
|
|
||||||
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
|
|
||||||
if (!settings.MultiThreadedMessageLoop)//消息循环
|
|
||||||
{
|
|
||||||
Application.Idle += (sender, e) => { CefRuntime.DoMessageLoopWork(); };
|
|
||||||
}
|
|
||||||
AboutDevCompanion DC = new AboutDevCompanion(1, false);
|
|
||||||
DC.Run();
|
|
||||||
Register();
|
|
||||||
// 启动程序
|
|
||||||
Manager.StartForm();
|
|
||||||
CefRuntime.Shutdown();
|
|
||||||
DC.Stop();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
MessageUtil.Show(ex);
|
|
||||||
LogHelper.Instance.WriteError(ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#region 浏览器处理类
|
#region 浏览器处理类
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user