Обнаружение запущенного экземпляра программы и передача ему информации - PullRequest
2 голосов
/ 11 марта 2009

В .NET, какой самый надежный способ обнаружить, если экземпляр той же программы уже запущен? Кроме того, как лучше всего передать аргументы командной строки уже запущенному экземпляру (например, чтобы открыть конкретный документ)?

Ответы [ 5 ]

3 голосов
/ 11 марта 2009

Существует три хорошо известных способа реализации приложений с одним экземпляром в программах .NET: метод процесса, метод Mutex и метод Visual Basic.

Майкл Ковингтон обсуждает первые два в своей подсказке, Обеспечение того, что только один экземпляр приложения .NET работает .

Есть статья CodeProject , в которой более подробно обсуждается метод Mutex, включая получение дескриптора окна существующего приложения, чтобы вы могли (каким-то образом) связаться с ним.

Другая статья CodeProject описывает, как использовать классы в пространстве имен Microsoft.VisualBasic (которое доступно из C #) для реализации приложения с одним экземпляром.

Я совсем не знаком с третьим методом. Из первых двух они оба работают, но, как указано в связанных статьях, метод Mutex кажется более надежным. Я не знаю, почему Mutex был выбран в качестве названного объекта для использования. Любой из названных объектов синхронизации (EventWaitHandle, Mutex, Semaphore и т. Д.) Будет работать.

Связь с существующим приложением представляет большую проблему. Я бы посоветовал вам изучить использование именованных каналов, если все, что вам нужно, это отправить относительно небольшое сообщение запущенному приложению. Проверьте System.IO.Pipes.NamedPipeClientStream для получения дополнительной информации.

Я также должен отметить, что если вы беспокоитесь о безопасности, вам необходимо обезопасить любой способ связи, который вы используете. Любое приложение с достаточными разрешениями сможет отправлять информацию в ваше работающее приложение через именованный канал.

1 голос
/ 11 марта 2009

Вы можете использовать .Net remoting (.Net 2.0) или WCF (.Net 3.5) для связи между программами на одном и том же или разных компьютерах.

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

0 голосов
/ 11 марта 2009

Чтобы определить, запущено ли приложение, не используйте Mutex, потому что у него огромные накладные расходы. Используйте

using System.Diagnostics;

public bool IsProcessOpen(string name)
{
    foreach (Process clsProcess in Process.GetProcesses) {
        if (clsProcess.ProcessName.Contains(name)) return true;
    }
    return false;
}

Чем больше информации вы предоставите об этом «другом приложении», тем лучше. Если вы разработали «другое приложение», вы можете сериализовать некоторые данные в другое приложение, чтобы сообщить ему, какую другую информацию вы хотите получить. Проверьте .NET Framework XMLSerializer. Вы даже можете сделать что-то простое, например, использовать запись в базе данных. Вы можете использовать пакет UDP. Есть много способов общения с другой программой. Вопрос в том, что это за другая программа?

0 голосов
/ 11 марта 2009

" Каков наилучший способ передачи аргументов командной строки уже запущенному экземпляру (например, для открытия определенного документа)?

К сожалению, я не верю, что это возможно. Приложение может использовать Console.ReadLine () для получения ввода из стандартного ввода, но это не то же самое, что передача аргументов командной строки.

Существует несколько других способов межпроцессного взаимодействия через .NET. .NET Remoting и WCF, а также собственные протоколы сокетов.

Вы можете использовать пространство имен System.Diagnostics для сбора списка запущенных процессов.

0 голосов
/ 11 марта 2009

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

Однако я не знаю, как разговаривать с уже запущенным приложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...