Синглтон приложения Winform, но предоставить параметры? - PullRequest
1 голос
/ 19 сентября 2011

У меня есть приложение webform (c #), которое может работать только в одном экземпляре.Также важно, чтобы в случае повторного запуска приложения (щелкните значок приложения) новые параметры были перенаправлены в текущий экземпляр, но теперь должно быть запущено приложение.

У меня возникла проблема Google, и я нашел это: http://www.sanity -free.com / 143 / csharp_dotnet_single_instance_application.html

Вот как я настроил это до сих пор:

public class MyApp : ApplicationContext
{
        private static MyApp _instance;
        private static Mutex _mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");

        [STAThread]
        public static void Main(string[] args)
        {
             MyParams params;

             params = ExtractParams(args);

             if (_mutex.WaitOne(TimeSpan.Zero, true))
             {
                  _instance = new MyAppp(params);
                  Application.Run(_instance);
             }
             else
             {
                  _instance.SetParameters(params);
             }
        }
}

Проблема с этимво второй раз, когда я пытаюсь запустить программу, я получаю исключение, если _instance имеет значение null?

Что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

.NET-сборка Microsoft.VisualBasic.dll содержит класс с именем WindowsFormsApplicationBase .Он также может использоваться приложениями на C # и имеет свойство IsSingleInstance, которое можно установить для достижения требуемого поведения.

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

См. Пример здесь .

1 голос
/ 19 сентября 2011

В данном случае это межпроцессное взаимодействие (IPC), поэтому _instance не имеет смысла. Если вы хотите иметь IPC, есть несколько способов: сокет, namepiped, обмен сообщениями ...

Я думаю, что подходят 2 метода:

  1. Получить предыдущий процесс по имени процесса -> вызвать P / Invoke метод EnumWindows, чтобы получить дескриптор главного окна. Отправить сообщение с идентификатором было зарегистрировано в RegisterWindowMessage ранее, чтобы передать параметры.
  2. Создайте сервер namedpipe для прослушивания параметров нового процесса.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...