Как запретить пользователю открывать более одного экземпляра exe - PullRequest
0 голосов
/ 28 мая 2018

Мое приложение выпущено в виде exe в двух версиях сборки - DeveloperBuild и ClientBuild (UAT).DeveloperBuild предназначен для внутренних разработчиков и тестирования QA, а ClientBuild для конечных пользователей.«DeveloperBuild» и «ClientBuild» на самом деле являются именами сборок.

Я хочу запретить пользователю открывать более одного экземпляра сборки. Проще говоря, пользователь должен иметь возможность открывать один экземпляр DeveloperBuild и одинодновременно с экземпляром ClientBuild, НО пользователю нельзя разрешать открывать более одного экземпляра DeveloperBuild или ClientBuild одновременно.

Это то, что я пробовал.Приведенный ниже код помогает мне поддерживать один экземпляр моего приложения, но он не различает Developer Build и Client Build.Я хочу, чтобы у пользователя было преимущество в открытии одного экземпляра каждой из двух сборок одновременно.

/// Точка входа в приложение

    protected override void OnStartup(StartupEventArgs e)
    {           
        const string sMutexUniqueName = "MutexForMyApp";

        bool createdNew;

        _mutex = new Mutex(true, sMutexUniqueName, out createdNew);

        // App is already running! Exiting the application  
        if (!createdNew)
        {               
            MessageBox.Show("App is already running, so cannot run another instance !","MyApp",MessageBoxButton.OK,MessageBoxImage.Exclamation);
            Application.Current.Shutdown();
        }

        base.OnStartup(e);

        //Initialize the bootstrapper and run
        var bootstrapper = new Bootstrapper();
        bootstrapper.Run();
    }

1 Ответ

0 голосов
/ 28 мая 2018

Имя мьютекса должно быть уникальным для каждой сборки.Поскольку у вас есть разные имена сборок для каждой версии, вы можете включить это имя в имя вашего мьютекса, как показано ниже.

protected override void OnStartup(StartupEventArgs e)
{           
    string sMutexUniqueName = "MutexForMyApp" + Assembly.GetExecutingAssembly().GetName().Name;

    bool createdNew;

    _mutex = new Mutex(true, sMutexUniqueName, out createdNew);

    // App is already running! Exiting the application  
    if (!createdNew)
    {               
        MessageBox.Show("App is already running, so cannot run another instance !","MyApp",MessageBoxButton.OK,MessageBoxImage.Exclamation);
        Application.Current.Shutdown();
    }

    base.OnStartup(e);

    //Initialize the bootstrapper and run
    var bootstrapper = new Bootstrapper();
    bootstrapper.Run();
}
...