使用Microsoft.VisualBasic.ApplicationServices来管理应用程序的单个实例

本文关键字:应用程序 单个 实例 管理 Microsoft VisualBasic ApplicationServices 使用 | 更新日期: 2023-09-27 17:53:06

我已经设法从StackOverflow找到以下代码:

using Microsoft.VisualBasic.ApplicationServices;
using System.Windows.Forms;
namespace ExciteEngine2.MainApplication {
    public class SingleInstanceController: WindowsFormsApplicationBase {
        public delegate Form CreateMainForm();
        public delegate void StartNextInstanceDelegate(Form mainWindow);
        private readonly CreateMainForm formCreation;
        private readonly StartNextInstanceDelegate onStartNextInstance;
        public SingleInstanceController() {
        }
        public SingleInstanceController(AuthenticationMode authenticationMode)
            : base(authenticationMode) {
        }
        public SingleInstanceController(CreateMainForm formCreation, StartNextInstanceDelegate onStartNextInstance) {
            // Set whether the application is single instance
            this.formCreation = formCreation;
            this.onStartNextInstance = onStartNextInstance;
            IsSingleInstance = true;
            StartupNextInstance += this_StartupNextInstance;
        }
        private void this_StartupNextInstance(object sender, StartupNextInstanceEventArgs e) {
            if (onStartNextInstance != null) {
                onStartNextInstance(MainForm); 
                // This code will be executed when the user tries to start the running program again,
                // for example, by clicking on the exe file.
                // This code can determine how to re-activate the existing main window of the running application.
            }
        }
        protected override void OnCreateMainForm() {
            // Instantiate your main application form
            MainForm = formCreation();
        }
        //public void Run() {
        //  string[] commandLine = new string[0];
        //  base.Run(commandLine);
        //}
        protected override void OnRun() {
            base.OnRun();
        }
    }
}

我在我的Program.cs中有这个:

    private static Form CreateForm() {
        return new AppMDIRibbon();
    }
    private static void OnStartNextInstance(Form mainWindow)            
    {
        // When the user tries to restart the application again, the main window is activated again.
        mainWindow.WindowState = FormWindowState.Maximized;
    }
    [STAThread]
    static void Main(string[] args) {
        SingleInstanceController ApplicationSingleInstanceController = new SingleInstanceController(CreateForm, OnStartNextInstance);           
        ApplicationSingleInstanceController.Run(args);   
        #region Application Logic
        #endregion
    }

现在,我有很多应用程序逻辑,我需要在Run():

        #region Application Logic
        //Uninstall
        foreach (string arg in args) {
            if (arg.Split('=')[0] == "/u") {
                ApplicationLogger.Info("Uninstallation command received.");
                Process.Start(new ProcessStartInfo(Environment.GetFolderPath(Environment.SpecialFolder.System) + "''msiexec.exe", "/x " + arg.Split('=')[1]));
                return;
            }
        }
        SetupXPO();
        SetupLogging();
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB");
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.ThreadException += Application_ThreadException;
        try {
            ApplicationLogger.Info("Setting Telerik Theme: " + ConfigurationManager.AppSettings["ThemeToUse"]);
            ThemeResolutionService.ApplicationThemeName = ConfigurationManager.AppSettings["ThemeToUse"];
        }
        catch (Exception ex) {
            ApplicationLogger.Error("Exception while setting Telerik Theme.", ex);
            ThemeResolutionService.ApplicationThemeName = "ControlDefault";
        }
        DevExpress.UserSkins.OfficeSkins.Register();
        DevExpress.UserSkins.BonusSkins.Register();
        DevExpress.Skins.SkinManager.EnableFormSkins();
        DevExpress.Skins.SkinManager.EnableMdiFormSkins();
        if (args.Contains("/dx")) {
            Application.Run(new AppMDIRibbonDX());
            ApplicationLogger.Info("Application (DX) started.");
        }
        else {
            Application.Run(new AppMDIRibbon());
            ApplicationLogger.Info("Application started.");
        }
        #endregion

我如何设置这个逻辑?我使用命令行参数来实际启动一个备用表单。我使用命令行参数来导致卸载,并调用一些方法来设置DB和日志记录。同样,我也在设置文化和主题。所有这些都是在实际应用程序运行之前进行的。有人能提出建议吗?

使用Microsoft.VisualBasic.ApplicationServices来管理应用程序的单个实例

如果您简化您链接的Visual basic派生类,您可以替换当前对Application.Run()的调用。这取决于您希望如何处理后续实例。

对于下面的版本,只需将:Application.Run(myForm)的调用更改为SingleInstanceApplication.Run(myForm);

public sealed class SingleInstanceApplication : WindowsFormsApplicationBase
{
    private static SingleInstanceApplication _application;
    private SingleInstanceApplication()
    {
        base.IsSingleInstance = true;
    }
    public static void Run(Form form)
    {
        _application = new SingleInstanceApplication {MainForm = form};
        _application.StartupNextInstance += NextInstanceHandler;
        _application.Run(Environment.GetCommandLineArgs());
    }
    static void NextInstanceHandler(object sender, StartupNextInstanceEventArgs e)
    {
        // Do whatever you want to do when the user launches subsequent instances
        // like when the user tries to restart the application again, the main window is activated again.
        _application.MainWindow.WindowState = FormWindowState.Maximized;
    }
}

那么你的Main()方法包含你的"Application Logic"

   [STAThread]
    static void Main(string[] args) {
        #region Application Logic
        //Uninstall
        foreach (string arg in args) {
            if (arg.Split('=')[0] == "/u") {
                ApplicationLogger.Info("Uninstallation command received.");
                Process.Start(new ProcessStartInfo(Environment.GetFolderPath(Environment.SpecialFolder.System) + "''msiexec.exe", "/x " + arg.Split('=')[1]));
                return;
            }
        }
        SetupXPO();
        SetupLogging();
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB");
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.ThreadException += Application_ThreadException;
        try {
            ApplicationLogger.Info("Setting Telerik Theme: " + ConfigurationManager.AppSettings["ThemeToUse"]);
            ThemeResolutionService.ApplicationThemeName = ConfigurationManager.AppSettings["ThemeToUse"];
        }
        catch (Exception ex) {
            ApplicationLogger.Error("Exception while setting Telerik Theme.", ex);
            ThemeResolutionService.ApplicationThemeName = "ControlDefault";
        }
        DevExpress.UserSkins.OfficeSkins.Register();
        DevExpress.UserSkins.BonusSkins.Register();
        DevExpress.Skins.SkinManager.EnableFormSkins();
        DevExpress.Skins.SkinManager.EnableMdiFormSkins();
        if (args.Contains("/dx")) {
            SingleInstanceApplication.Run(new AppMDIRibbonDX());
            ApplicationLogger.Info("Application (DX) started.");
        }
        else {
            SingleInstanceApplication.Run(new AppMDIRibbon());
            ApplicationLogger.Info("Application started.");
        }
        #endregion
    }