Недавно я столкнулся со сценарием, когда приложение в системном трее (написанное на C #) должно было взаимодействовать с фоновой службой Windows (написанной на Golang). Я просмотрел множество ответов, блогов и статей о переполнении стека, чтобы найти правильный способ взаимодействия между двумя разными исполняемыми файлами, и нашел о Named-Pipes.

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

Я никогда раньше не реализовывал какой-либо IPC, поэтому отправка сообщений из фоновой службы (написанной на Go) в приложение в системном трее (написанное на C #) было для меня новостью, и после ее реализации мне очень понравилось видеть, как два разных исполняемых файла разговаривают с каждым. разное.

Что такое Named-Pipe?

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

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

Проще говоря, Named-Pipes может легко выступать в качестве канала связи для различных запущенных процессов. Вуаля !!! Это означает, что я могу использовать это и в случае.

Узнайте больше о Named-Pipes здесь

Именованные каналы в основном работают по принципу клиент / сервер. Любой процесс может действовать как сервер или клиент и отправлять сообщения туда и обратно. Хватит разговоров, давайте сразу перейдем к реализации.

Выполнение

В моем случае у меня было одно приложение в системном трее, написанное на C #, которое ожидало сообщений от фоновой службы, написанной на Golang (GO).

Я решил создать сервер Named-Pipe из приложения C # и клиента Named-Pipe из приложения Golang. Для простоты, вместо того, чтобы создавать само приложение на панели задач в учебнике, мы создадим консольное приложение (на C #) для создания сервера Named-Pipe, а вместо создания фоновой службы мы создадим простой клиент Named-Pipe. в ГО.

Любой, кто хочет создать сервер Named-Pipe из приложения в системном трее, также может сделать это с помощью аналогичной реализации.

Создание сервера Named-Pipe с помощью консольного приложения C #

Ниже приведен фрагмент реализации консольного приложения. Фрагмент ниже создает поток сервера Named-Pipe и ожидает, пока клиенты Named-Pipe подключатся к этому серверу и начнут отправлять сообщения.

Полный код см. В репозитории github: named-pipe-server

Построчное объяснение приведенного выше фрагмента

  1. Строки №11 и №12 создают экземпляр сервера именованного канала. Здесь PipeName обозначает имя канала, PipeDirection.InOut обозначает, что сервер может выполнять операции чтения и записи в именованном канале, 1 обозначает количество экземпляров сервера и PipeTransmissionMode. .Message обозначает формат в формате, в котором передается сообщение (он также может быть байтовым).
  2. Строка # 15 создает объект чтения потока для чтения сообщений из именованного канала.
  3. Строка № 18 - это блокирующий вызов, ожидающий подключения клиентов Named-Pipe к серверу.
  4. Как только клиент подключается к серверу Named-Pipe, мы можем прочитать отправленное им сообщение, как показано в строке № 26. Этот вызов также является блокирующим, пока клиент не подключится к серверу.
  5. Строка № 49 обеспечивает чтение сообщений из именованного канала до тех пор, пока клиент не подключится к серверу.

Шаги по запуску консольного приложения:

  • Загрузите и установите Visual Studio (для написания этого была использована Visual Studio 2019 Community Edition)
  • Клонируйте репо и перейдите в каталог проекта.
  • Откройте NamedPipe.sln в Visual Studio. Это автоматически загрузит проект в Visual Studio.
  • Создайте этот проект, щелкнув параметр сборки на верхней панели Visual Studio.
Build -> Build Solution
  • Откройте powershell (Windows) и перейдите к пути проекта path named-pipe-ipc / NamedPipe / bin / Debug / netcoreapp3.1 и выполните команду ниже в powershell -
NamedPipe.exe
  • Приведенная выше команда запустит сервер именованного канала, и теперь сервер может получать сообщения от любого клиента именованного канала.
  • Чтобы остановить сервер, необходимо нажать клавишу «q» на клавиатуре.

Более подробные инструкции по запуску приложения см. В репозитории: named-pipe-server

Создание клиента именованного канала с помощью Golang

Нам нужно вызвать функцию ниже, чтобы создать клиента Named-Pipe в Golang (Go).

  1. Строка № 4 создает клиента Named-Pipe и пытается подключиться к каналу, и нам нужно указать продолжительность в аргументах функции, в пределах которой соединение должно быть успешным, иначе вызов функции приведет к тайм-ауту.

Шаги по запуску приложения Golang:

  • Клонируйте репо и запустите, чтобы перейти в каталог репо проекта.
  • Откройте Windows PowerShell (администратор) и запустите сервер, используя команду ниже (при условии, что сервер уже запущен в вышеуказанных шагах):
go run client.go

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

Более подробную информацию о реализации и запуске приложения можно найти в репозитории: named-pipe-ipc. В этом репо вы также можете найти реализацию сервера именованного канала в Golang.

Примечание: перед запуском клиента необходимо запустить сервер.

Вывод

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

Это было просто введение и базовая реализация Named-Pipes. Надеюсь, это может кому-то помочь. Продолжайте учиться и счастливого кодирования !!!