|
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55
|
|
Межпроцессное взаимодействие C# <-> интерпретатор Lua01.12.2025, 20:06. Показов 3420. Ответов 43
Метки нет (Все метки)
Приветствую! Сейчас разбираюсь с задачей управления внешним Windows-приложением с интерпретатором Lua. Это "костыльная" система, альтернатив которой нет, потому не спрашивайте "зачем" - просто "надо".
Мне не хватает знаний по организации межпроцессного взаимодействия, потому прошу совета. Сейчас объясню архитектуру и в чём "затыка".1. Целевое приложение Win64 запускает в дочернем потоке интерпретатора скрипт Lua. 2. Скрипт Lua загружает мою DLL, написанную на C++. Код пишется с использованием статических библиотек разработчика интерпретатора Lua (*.lib, *.h). 3. Управляющее приложение С# должно взаимодействовать с целевым приложением (1) через библиотеку DLL. Допустим, я реализую в моей DLL базовый механизм двустороннего взаимодействия с целевым приложением. Но сама логика обработки данных целевого приложения не тривиальна и к тому же требует обращения к БД. Поэтому реализовывать весь код на C++ в самой DLL видится крайне неудобным вариантом. Было бы удобно "засунуть" в DLL необходимые интерфейсные методы взаимодействия с целевым приложением, а всю логику вынести в приложение C# (допустим, консольное). Проблема в том, что приложение C# будет работать в одном процессе, а DLL будет загружена целевым приложением в другом процессе, а потому напрямую обратиться к методам в DLL скорее всего не получится. Или есть варианты? Мне видится необходимым реализовать такие сценарии: 1. Синхронный вызов из приложения C# функции в DLL с возвратом параметров. Для возврата массивов данных можно использовать MemoryFile, заполняемые в DLL. 2. Синхронный обратный вызов из DLL функции в C# с передачей параметров. Для передачи массивов данных использовать MemoryFile, заполняемые в DLL. Существуют ли разумные способы безопасно реализовать такие сценарии? PS: Не хотелось бы идти по альтернативному варианту и помещать всю логику в функции в БД, вызываемые из DLL...
0
|
|
| 01.12.2025, 20:06 | |
|
Ответы с готовыми решениями:
43
Межпроцессное взаимодействие WCF
Межпроцессный обмен пакетами данных |
|
|
||
| 03.12.2025, 13:34 | ||
|
andreybs1,
Добавлено через 4 минуты andreybs1, Ну и как бы вот такое ещё есть - Embedding Lua in C# Applications: A Comprehensive Guide.
0
|
||
|
-196 / 65 / 2
Регистрация: 23.11.2024
Сообщений: 851
|
|
| 03.12.2025, 15:38 | |
|
У него Lua уже встроен во враждебное приложение. Зачем ему встраивать Lua ещё раз?
0
|
|
|
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55
|
||||||||||
| 03.12.2025, 21:25 [ТС] | ||||||||||
![]() 1. "Капиталистическое приложение" загружает dll в свой процесс путём запуска внутри себя скрипта lua с командой reqire('mylib.dll'). Это независимое адресное пространство в одном процессе. 2. Управляющее приложение запускается в своём отдельном процессе и ""слушает"/пинает" dll. Это другое адресное пространство в другом процессе. Вроде всё просто и однозначно. Есть варианты? Нет там никакой обертки "С++ над С dll"... Добавлено через 38 секунд
0
|
||||||||||
|
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55
|
||
| 03.12.2025, 21:34 [ТС] | ||
|
0
|
||
|
|
|
| 03.12.2025, 21:41 | |
|
Столько много слов, а суть так и не ясна: какие данные откуда и зачем должны передаваться/перехватываться. Как должно реагировать приложение шарпа на это... Что принимать, что отсылать, какие структуры..
В общем, много воды, а понимания задачи околонулевое.. Если это не какой-то игровой процесс, то использование LUA-движка еще больше напускает тумана непонимания. А в целом, тут прослеживается, условно, два процесса с общим ресурсом. Оба приложения могут читать/управлять этим ресурсом, а сам ресурс должен понимать и уметь общаться с обоими клиентами. Ну и разрешать конфликты, разумеется.
0
|
|
|
|
||
| 03.12.2025, 21:49 | ||
|
Вообще написать свои правила упаковки/распаковки из сырых байтов вообще не проблема, это прям супер примитивная задача, скоре муторная с вопросами дальнейшего сапорта. Ну и в вашем случае проблема что нужно будет всё это писать/править сразу для двух проектов на двух разных языках, и остро станет вопрос контроля соответствия.
0
|
||
|
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55
|
||
| 03.12.2025, 21:55 [ТС] | ||
|
Специально пронумеровал, чтобы обращаться к блокам на схеме. 1-2-3 уже есть, это нельзя изменить. 4 я могу написать, используя стандартные библиотеки lua.lib 6 и 7 уже написано мною для другой задачи предполагается доработать 6 для взаимодейтсвия с 5
0
|
||
|
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55
|
|||
| 03.12.2025, 22:00 [ТС] | |||
|
см.выше Добавлено через 2 минуты
0
|
|||
|
|
|
| 03.12.2025, 22:15 | |
|
andreybs1, ну вот теперь яснее выглядит. Правда, к шарпу вопрос относится поверхностно: внедрить плюсовые сборки в код C# не проблема. Основная работа будет в модуле "5" на C++, создать соотв. события и методы для шарпового приложения. Ну и описать структуры передаваемых данных, чтобы обоим были понятны..
0
|
|
|
|
|
| 03.12.2025, 22:27 | |
|
а 2-3 это сервис, или обычное десктопное приложение? Если подразумевается что "запустили основное приложение и тут же появилось наше C# приложение", я бы тоже рассматривал возможность инжекта в сам процесс, а не стороним процессом. Если нужно независимо крутящееся приложение, и возможность подключиться стороним приложением через контракт в dll -- вроде ок.
0
|
|
|
|
||
| 03.12.2025, 22:47 | ||
|
Не по теме: Что-то вопросы пошли такие... Любопытные.. :)) Типа "как внедриться куда-то и что-то там сделать". Через контракт спокойно, я так читы для сетевых игр делал.. Через LUA как раз.
0
|
||
|
|
||
| 03.12.2025, 23:17 | ||
|
Я к тому что если 2-3 -- часть какого-то фонового сервиса, то задум с межпроцессорным взаимодействием имеет смысл.
0
|
||
|
|
|
| 03.12.2025, 23:52 | |
|
Wolfdp, ага, просто LUA - скриптовой движок и довольно старый, начал "пропадать" примерно в 2008-10х годах. Давноооо его не встречал в игровых механиках и тем более в других приложениях.
Добавлено через 7 минут andreybs1, я инжектился к LUA напрямую с помощью AutoIt. Это тоже скриптовый язык, но весьма продвинутый - в том числе тоже юзает механизмы .NET. В мои годы он довольно серьезно развивался. На данный момент не могу сказать что с ним, давно не наблюдаю. Точно скажу, что на нем перехват системных сообщений, драйверов, мышек-клав, флешек - делалось на раз-два.
0
|
|
|
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55
|
|||||
| 04.12.2025, 00:23 [ТС] | |||||
|
Добавлено через 2 минуты Там связка 2-3 весьма специфичная. Там как бы lua, но реализующий связку с объектной моделью приложения 2. Типа "правильный" lua. ) Его ценность как раз в доступе к объектной модели приложения 2, а не в инжекте всякими псевдохакерскими средствами и перехвате чего-то там. Всё итак доступно и даже официальная документация есть. Эту систему хакнуть даже при желании сходу не получится, т.к. там сложное шифрование на каждом шагу. Но идея с AutoIt прикольная. )
0
|
|||||
|
-196 / 65 / 2
Регистрация: 23.11.2024
Сообщений: 851
|
|||
| 04.12.2025, 10:16 | |||
|
1.а) "Капиталистическое приложение" ... это независимое адресное пространство в одном процессе. 1.б) "Капиталистическое приложение" загружает dll в свой процесс ... reqire('mylib.dll') Этого в принципе достаточно для того, чтобы в mylib.dll запустить шарповый код из блока 6 в картинке. Сам блок 6 надо будет немного перепилить из консольного .exe в управляемую .dll, но она-то ваша и модифицруемая, так что это не страшно.
0
|
|||
|
|
|||
| 04.12.2025, 10:31 | |||
Добавлено через 1 минуту Или я что-то не так понял...
0
|
|||
|
|
|
| 04.12.2025, 13:58 | |
|
Мне сложно сказать насколько связка C++, Lua, C# сложна в дебаге, по єтому пункту решать исключительно вам с оглядкой на совет знающих.
Если судить чисто абстрактно: внедрение либы в приложение более гибкий и правильный вариант. Канал пайплайна тут скорее будет ограничением, например если нужно распараллелить работу (у вас вроде обратная задача стоит). Тем не менее вариант дочернего процесса + пайплайн -- норм. Причём можно сделать так: - используем анонимные каналы, которые разрешают доступ только дочерним процессам - dll точке входа создает два сервера: один на write, другой на read - запускаем дочернее приложение и в аргументах передаем дескрипторы - дочернее приложение запускает у себя соответсвующие клиенты. - обмен сообщениями через json/protobuff. В идеале нужен отдельный проект, который будет содержать только описание моделей (для protobuff это вроде текстовые файлы описывающие поля), и на основе их проекты C#/C++ будут генерить автокод с моделями. - сам код C# программы стоит хранить в dll качестве ресурсов или чтобы C++ либа ссылалась на неё. Это гарантирует что вы будете ссылаться на правильную сборку, и не случится ситуации что запускаете старую программу. - анонимные каналы будут гарантировать что только дочерний процесс получит доступ к данным текущего процесса. А значит если вдруг в одном окружении нужно запустить два экземпляра основной программы -- ноль проблем. Возни в таком подходе больше, но меньше головной боли при сопровождении кода. Поменяли структуру передаваемых данных -- билд -- сразу увидили ошибки, а не "там новое, там старое, падает в рандомном моменте". Билд подразумевает на выходе одну C++ либу, которая содержит в себе C# программу, что избавляет от "там поменял, там забыл". Всегда меняем всю C++ либу. Анонимные каналы сложнее в том плане что не позволяют работать двунаправленно или по сети, но гарантируют изоляцию.
0
|
|
|
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55
|
|||||
| 04.12.2025, 15:09 [ТС] | |||||
|
Главный вопрос вызывает процесс дебага кода, написанного на шарпе в таком варианте. А кода там много. И дебаг нужен именно в контексте взаимодействия "капиталистического приложения". Тут надо подумать. Добавлено через 2 минуты Добавлено через 9 минут
0
|
|||||
|
-196 / 65 / 2
Регистрация: 23.11.2024
Сообщений: 851
|
||||
| 04.12.2025, 15:46 | ||||
|
Затем Lua вызывает этот ваш C++, C++ прокидывает вызов в управляемую DLL через P/Invoke колбэк. Можете вашу .lib прилинковать к вашей C++ .dll-библиотеке, это никак не влияет. Из C# кода тоже можно вызывать C++ и оттуда попасть в этот .lib статически прилинкованный, а затем вернуться в C#. Добавлено через 1 минуту Добавлено через 5 минут Ну, собственно и что? Почему это плохо? В C# есть фреймворки для плагинов, их несколько разных. Есть MAF - самое сложное и зубодробительное решение из всех, которые я видел. Зато позволяет принять решение о том, проводить запуск в отдельном процессе или в том же при помощи конфигруирования после деплоймента. То есть, немножко шарпа внутрь, весь остальной снаружи, и всю коммуникацию писать на шарпе. Обоснование - любимый язык.
0
|
||||
| 04.12.2025, 15:46 | |
|
Межпроцессная архитектура приложений Не могу написать проект... (интерпретатор команд для управления объектом) Пишу интерпретатор синтаксиса аля С, использую COCO/R Можно ли на C# написать интерпретатор Можно ли написать простейший интерпретатор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|