2016-01-05 9 views
1

Я знаю, что этот вопрос может быть немного глупым, но я новичок в C# и в кодировании вообще. Недавно я сделал приложение, и я хочу ограничить его тем, что он только один раз запускает его за раз, так что пользователь не может его запускать несколько раз. Я нашел этот ответ на michalczerwinski на StackOverflow:Отдельный экземпляр приложения в C#

[STAThread] 
static void Main() 
{ 
    bool result; 
    var mutex = new System.Threading.Mutex(true, "UniqueAppId", out result); 

    if (!result) 
    { 
     MessageBox.Show("Another instance is already running."); 
     return; 
    } 

    Application.Run(new Form1()); 

    GC.KeepAlive(mutex);    // mutex shouldn't be released - important line 
} 

Может кто-нибудь сказать мне, где я должен добавить это? Я попытался добавить его везде внутри Form1.cs, но он не работает.

+0

По умолчанию Visual Studio помещает 'метод Main' в файле Program.cs. Откройте этот файл и скопируйте в метод 'Main' содержимое этого' Main' метода, и вам должно быть хорошо идти (если вы не переименовали 'Form1' или что-то в этом роде). – adv12

+0

@ adv12 Это сработало. Спасибо за вашу помощь! –

ответ

1
static void Main() 

Является ли главная функция. Вы должны добавить это в файл «Program.cs» (стандартное имя) к этой конкретной функции (перед всем остальным в функции).

И это хорошая практика для освобождения ресурсов. Поэтому было бы неплохо добавить mutex.Dispose(); или using (mutex) { } в конце функции (не оба, только одна из этих опций).

1

(обновление: я, очевидно, не внимательно прочитал ваш вопрос, так как у вас есть способ для одного экземпляра и просто хотел узнать, где его добавить. В любом случае, я думаю, что этот ответ по-прежнему полезен, поскольку он обеспечивает хорошее путь для одного экземпляра-приложений с последующими возможностями и нет необходимости заботиться о мьютексах в собственном коде.

Вы можете получить класс из WindowsFormsApplicationBase, установите IsSingleInstance свойство true и переопределить метод OnCreateMainForm. You необходимо будет указать Microsoft.VisualBasic.dll вашему проекту.

Here - хороший пример использования WindowsFormsApplicationBase для обработки дальнейших запусков процесса и вызова уже запущенного экземпляра.

Наследуется класс:

public class App : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase 
{ 
    public App() 
    { 
     // Make this a single-instance application 
     this.IsSingleInstance = true; 
     this.EnableVisualStyles = true; 
    } 

    protected override void OnCreateMainForm() 
    { 
     // Create an instance of the main form 
     // and set it in the application; 
     // but don't try to run() it. 
     this.MainForm = new Form1(); 
    } 
} 

И ваш главный метод будет выглядеть следующим образом:

static void Main(string[] args) 
{ 
    App myApp = new App(); 
    myApp.Run(args); 
} 
Смежные вопросы