Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > запуск только одной копии приложения


Автор: CasperSC 17.7.2010, 17:49
Здравствуйте! Написал программу, использую Mutex для ограничения одновременно запущенных копий программы. Но вот когда я выбераю тип построения Release, то этот Mutex перестаёт работать. Вообще я понял так, на это влияет опция "Оптимизировать код". Дело в том, что отключить эту опцию не вариант, после любого обфускатора этот Mutex также не работает. Вообще не знаю что делать.

Код

    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main(string[] arguments)
        {
            //Включаем визуальные стили раньше, чем будет проверка, чтобы MessageBox выглядел современно
            Application.EnableVisualStyles(); 
            Application.SetCompatibleTextRenderingDefault(false);

            const String AppName = "My Program"; //Просто название приложения
            bool oneOnly;
            bool NeedHide = false;
            if (arguments.Length != 0)
            {
                if (arguments[0] == "-hide")
                {
                    NeedHide = true;
                }
            }

            // Указываем имя своей программы. В нашем случае My Program
            Mutex m = new Mutex(true, AppName + "7696579547995", out oneOnly);
            if (oneOnly)
            {
                Application.Run(new MainForm(NeedHide));
            }
            else
            {
                MessageBox.Show("Приложение " + AppName + " уже запущено.");
            } 
        
        }
    }


Может есть вариант какой нибудь другой ограничивающий кол-во запущенных приложений?

Автор: mihryak 17.7.2010, 22:53
сделай мюьтекс полем класса, в релизе он идёт в мусор и там освобождается, т.к. никто ссылку на него не хранит

Добавлено через 1 минуту и 36 секунд
или, что правильней, наверное, после Application.Run(new MainForm(NeedHide)); вызови его освобождение

Автор: CasperSC 18.7.2010, 01:00
Добавил освобождение Mutex'a, теперь всё нормально работает и обфускатор тоже ничего не портит, как портил раньше.. Спасибо!
Код

            // Указываем имя своей программы. В нашем случае My Program
            Mutex m = new Mutex(true, AppName + "7696579547995", out oneOnly);
            if (oneOnly)
            {
                Application.Run(new MainForm(NeedHide));
                m.ReleaseMutex();
            }
            else
            {
                MessageBox.Show("Приложение " + AppName + " уже запущено.");
            } 

Автор: Mephisto 26.7.2010, 13:33
Так будет лучше
Код

// Указываем имя своей программы. В нашем случае My Program
            Mutex m = new Mutex(true, AppName + "7696579547995", out oneOnly);
            if (oneOnly)
            {
                try
                {
                    Application.Run(new MainForm(NeedHide));
                }
                finally
                {
                    m.ReleaseMutex();
                }
            }
            else
            {
                MessageBox.Show("Приложение " + AppName + " уже запущено.");
            } 

хотя, вот подумал. Может в майкрософте уже сделали нечто похожее у себя внутри, хотя не факт. Я бы перестраховался.

Автор: nmn 26.7.2010, 22:41
можно в роли имени мьютекса использовать guid, тогда имя будет точно уникальным

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)