Дружим код ZennoPoster с .NET и другими ЯП

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 383
Благодарностей
924
Баллы
113
Привет друзья! В этой статье я расскажу, как взаимодействовать с внешними приложениями, написанными на различных языках программирования через ZennoPoster.

Для этого мы будем использовать Именованный канал (Named Pipe).

Именованный канал (Named Pipe) - это механизм, который позволяет двум программам обмениваться данными прямо во время работы.
Одна программа записывает информацию в канал, а другая сразу её считывает. При этом данные не сохраняются на диск, а проходят "по трубе" напрямую, что делает обмен быстрым и удобным. Используется, когда нужно связать разные процессы так, чтобы результат работы одной программы сразу поступал на вход другой.

Рассмотрим, где это можно применить.

  • Доступ к современному .NET.
    Когда мы работаем с ZennoPoster, то часто сталкиваемся с ограничениями старого .NET Framework 4.6.2, на котором он работает. Многие современные библиотеки требуют более свежих версий фреймворка или даже перехода на .NET Core/5/6+. Но есть простой способ обойти это ограничение и подключить к своим проектам все возможности новых технологий - использовать каналы связи (pipe) для взаимодействия с внешними приложениями. Мы можем поднять отдельное приложение на актуальной версии .NET, а ZennoPoster будет передавать ему данные через pipe и получать результат назад при необходимости. В итоге мы получаем свежие возможности, оставаясь в рамках старой платформы. Это можно использовать и без pipe, а просто передавая аргументы.
  • Защита кода.
    В старых сборках под .NET Framework 4.x весь код хранится в IL и спокойно открывается в dotPeek. В новых версиях .NET (6 и выше) можно собирать приложения с NativeAOT. В этом случае IL вообще нет - на выходе получается нативный exe, который нельзя посмотреть в декомпиляторе. Реверс такого приложения становится гораздо сложнее, и можно не переживать, что кто-то в пару кликов получит Ваш исходник. Фразы типа "выносите логику в отдельный exe" становятся более актуальными при таком подходе.
  • Другие языки программирования.
    Pipe - это не только про .NET, но и про многие языки и операционные системы. В принципе, концепция pipe универсальна и она существует как в Windows, так и в Linux/Unix. Вот cписок популярных ЯП с поддержкой pipe, наверняка есть еще:
    • C / C++
    • C# / .NET
    • Python
    • Java
    • Go
    • Ruby
    • Node.js / JavaScript
    • Perl
    • Rust
  • Работа через сеть.
    Pipe работает не только локально, но и через TCP. Это значит, что ZennoPoster может общаться с приложением, запущенным на другом сервере или в виртуальной машине. Это позволяет разбить задачи на разные сервера.
  • Нет ограничения в 32 768 символов
    Если запускать внешние программы через параметры командной строки, то есть ограничение на длину строки. С pipe такого лимита нет - можно передавать большие куски текста, JSON, HTML, всё что угодно.
Как видите, плюсов достаточно! Конечно, в большинстве сценариев это может быть избыточным, но в некоторых случаях это просто must-have.

Для демонстрации работы я прикрепляю код клиента ZPClient.cs - в качестве клиента у нас выступает ZennoPoster. Он вставляется в Общий код. Вызывается так:
C#:
project.Variables["Translated_Text"].Value = PipeWorker.PipeConnect(project, project.Variables["Text_For_Translate"].Value);
Имена канала в примерах "ZennoPosterPipe".

Код сервера (папка Server) на .NET. Он ничего не делает, просто возвращает строку что все дошло. Чисто пример кода и сборки в AOT.

Так же для примера взаимодействия с другими ЯП я добавлю пример взаимодействия с Python скриптом, так как это пожалуй самый актуальный язык. Он получает строку и переводит ее через deep_translator. Не мог придумать ничего для примера и решил показать работу на первом попавшимся переводчике. Качество перевода убогое, но это всего лишь пример использования. При первом запуске скрипт сам установит нужные зависимости. Вы можете использовать код как заготовку для некоторых проектов, меняя код ниже
# Наш код (меняется под задачу)
Функция
Python:
ensure_package("deep-translator", "deep_translator")
- проверит установлен ли пакет и при необходимости установит его. Можете добавлять вызовов столько, сколько у Вас пакетов. Далее подключаем их.
При получении данных по pipe скрипт вызывает функцию "def work(text: str):" и передает в нее строку. Что вернет функция - вернется в ZennoPoster.

Пример сборки AOT и работы сервера смотрите в видео.

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

Спасибо за внимание и хороших Вам кейсов:bt:

 

Вложения

Последнее редактирование модератором:

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)