Как правильно создать одноэкземплярное приложение WPF?

Вы можете использовать класс .net-framework Mutex, но вскоре вы обнаружите, что csharp вам нужно будет реализовать dotnet код для передачи аргументов c# и т.п. самостоятельно. Что mutex ж, я научился одному трюку .net-framework при программировании в WinForms, когда wpf читал Chris Sell's book. Этот трюк использует .net-framework логику, которая уже доступна .cs-file нам во фреймворке. Не знаю, как mutex вы, но когда я узнаю о вещах, которые .net можно повторно использовать csharp во фреймворке, я обычно иду visual-c# по этому пути, а не изобретаю c-sharp велосипед. Если, конечно, он c-sharp не делает все, что я хочу.

Когда c# я занялся WPF, я придумал dotnet способ использовать тот же dotnet код, но в приложении WPF. Это dot-net решение должно соответствовать mutex вашим потребностям, исходя dot-net из вашего вопроса.

Во-первых, нам mutex нужно создать наш класс приложения. В csharp этом классе мы переопределим dot-net событие OnStartup и создадим dotnet метод Activate, который будет c-sharp использоваться позже.

public class SingleInstanceApplication : System.Windows.Application
{
    protected override void OnStartup(System.Windows.StartupEventArgs e)
    {
        // Call the OnStartup event on our base class
        base.OnStartup(e);

        // Create our MainWindow and show it
        MainWindow window = new MainWindow();
        window.Show();
    }

    public void Activate()
    {
        // Reactivate the main window
        MainWindow.Activate();
    }
}

Во-вторых, нам dotnet нужно создать класс, который dotnet сможет управлять нашими экземплярами. Прежде .net чем перейти к этому, мы на c#.net самом деле собираемся повторно c#.net использовать некоторый код, который csharp находится в сборке Microsoft.VisualBasic. Поскольку c-sharp в этом примере я использую c# C#, мне пришлось сделать wpf ссылку на сборку. Если вы .net используете VB.NET, вам не wpf нужно ничего делать. Класс, который .net мы собираемся использовать, называется wpf WindowsFormsApplicationBase, и visual-c# мы наследуем от него наш .net диспетчер экземпляров, а c#.net затем используем свойства wpf и события для обработки единичного dotnet экземпляра.

public class SingleInstanceManager : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
{
    private SingleInstanceApplication _application;
    private System.Collections.ObjectModel.ReadOnlyCollection _commandLine;

    public SingleInstanceManager()
    {
        IsSingleInstance = true;
    }

    protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
    {
        // First time _application is launched
        _commandLine = eventArgs.CommandLine;
        _application = new SingleInstanceApplication();
        _application.Run();
        return false;
    }

    protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
    {
        // Subsequent launches
        base.OnStartupNextInstance(eventArgs);
        _commandLine = eventArgs.CommandLine;
        _application.Activate();
    }
}

По сути, мы используем c-sharp биты VB для обнаружения отдельных .cs-file экземпляров и соответствующей .cs-file обработки. OnStartup будет .cs-file запущен при загрузке первого .net-framework экземпляра. OnStartupNextInstance c-sharp запускается при повторном c#-language запуске приложения. Как видите, я .net могу получить то, что было c-sharp передано в командной строке, через visual-c# аргументы события. Я установил dot-net значение в поле экземпляра. Вы .cs-file можете разобрать командную csharp строку здесь или передать .cs-file ее своему приложению через c-sharp конструктор и вызов метода mutex Activate.

В-третьих, пришло csharp время создать нашу EntryPoint. Вместо dot-net того, чтобы обновлять приложение, как .net вы обычно это делаете, мы c#.net воспользуемся преимуществами .net-framework нашего SingleInstanceManager.

public class EntryPoint
{
    [STAThread]
    public static void Main(string[] args)
    {
        SingleInstanceManager manager = new SingleInstanceManager();
        manager.Run(args);
    }
}

Что .net-framework ж, я надеюсь, что вы сможете visual-c# следить за всем и сможете .net использовать эту реализацию .net и сделать ее своей.

c#

.net

wpf

mutex

2022-11-18T21:56:05+00:00
Вопросы с похожей тематикой, как у вопроса:

Как правильно создать одноэкземплярное приложение WPF?