Существует три хорошо известных способа реализации приложений с одним экземпляром в программах .NET: метод процесса, метод Mutex и метод Visual Basic.
Майкл Ковингтон обсуждает первые два в своей подсказке, Обеспечение того, что только один экземпляр приложения .NET работает .
Есть статья CodeProject , в которой более подробно обсуждается метод Mutex, включая получение дескриптора окна существующего приложения, чтобы вы могли (каким-то образом) связаться с ним.
Другая статья CodeProject описывает, как использовать классы в пространстве имен Microsoft.VisualBasic (которое доступно из C #) для реализации приложения с одним экземпляром.
Я совсем не знаком с третьим методом. Из первых двух они оба работают, но, как указано в связанных статьях, метод Mutex кажется более надежным. Я не знаю, почему Mutex был выбран в качестве названного объекта для использования. Любой из названных объектов синхронизации (EventWaitHandle, Mutex, Semaphore и т. Д.) Будет работать.
Связь с существующим приложением представляет большую проблему. Я бы посоветовал вам изучить использование именованных каналов, если все, что вам нужно, это отправить относительно небольшое сообщение запущенному приложению. Проверьте System.IO.Pipes.NamedPipeClientStream для получения дополнительной информации.
Я также должен отметить, что если вы беспокоитесь о безопасности, вам необходимо обезопасить любой способ связи, который вы используете. Любое приложение с достаточными разрешениями сможет отправлять информацию в ваше работающее приложение через именованный канал.