.Net / Mono Singleton (сервис / сервер?) в C # - определяет, запущено ли уже мое .net-приложение, и передает ему аргументы командной строки

StackOverflow https://stackoverflow.com/questions/810181

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хотел бы создать простое одноэлементное приложение командной строки (сервис?) на C #, которое при запуске проверяло, запущено ли оно уже, и если да, то передавало аргументы командной строки уже запущенному экземпляру и закрывало себя.Теперь в уже запущенном экземпляре он получит аргументы командной строки через событие типа "delegate void Command (string[] args);" или что-то в этом роде, поэтому я могу управлять командной строкой через одно приложение с помощью событий.

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

Или в веб-браузере вы можете настроить его таким образом, чтобы при открытии нового html-файла он открывался на новой вкладке, а не в новом экземпляре окна.

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

многие музыкальные проигрыватели, такие как winamp, тоже это делают...

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

Кроме того, если вы знаете лучший способ или api в .Net перенаправить все переданные аргументы командной строки на событие службы, которая всегда запущена, я могу с этим поработать...но я также хотел бы сохранить эту кроссплатформенность, чтобы она могла работать в Linux / Mac на Mono, если это возможно, без необходимости управлять двумя или более кодовыми базами...

Это было полезно?

Решение

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

Приложение на C # с одним экземпляром - для .NET 2.0

Другие советы

Мы сделали нечто подобное, используя, хотя и для совсем других целей, .net remoting на платформе 1.0 / 1.1.По сути, мы бы использовали семафор, чтобы гарантировать, что мы являемся единственным запущенным экземпляром.Вы захотите настроить таргетинг на глобальное пространство имен, если хотите иметь только один экземпляр на машину, или на локальное, если хотите по одному экземпляру на сеанс пользователя (в сценариях службы терминалов и быстрого переключения пользователей).

Если вы можете заблокировать semphore, вы настроите удаленное взаимодействие и начнете прослушивать события, а затем продолжите работу с вашим кодом.

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

Вы могли бы попробовать использовать именованный мьютекс (присвоение ему имени сделает его общесистемным и легко идентифицируемым).С помощью мьютекса вы можете либо запустить экземпляр (если мьютекса с таким именем не существует), либо открыть существующий экземпляр и передать свои параметры.Приношу извинения за отсутствие примера кода, пишу это со своего телефона.

Редактировать:видеорегистратор.Просто перечитайте пост, и я не думаю, что это сработает для вас, если вы перейдете на кросс-платформенный.

В Visual Basic это встроено.Взгляните на:

Microsoft.VisualBasic.Службы приложений.WindowsFormsApplicationBase -- Поддержка запуска публичных мероприятий

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top