|
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55
|
|
Межпроцессное взаимодействие C# <-> интерпретатор Lua01.12.2025, 20:06. Показов 2428. Ответов 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
|
||
|
-72 / 65 / 2
Регистрация: 23.11.2024
Сообщений: 813
|
|
| 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
|
|||||
|
-72 / 65 / 2
Регистрация: 23.11.2024
Сообщений: 813
|
|||
| 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
|
|||||
|
-72 / 65 / 2
Регистрация: 23.11.2024
Сообщений: 813
|
||||
| 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# написать интерпретатор Можно ли написать простейший интерпретатор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж»
Уважаемые коллеги!
Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
|
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы
Математический аппарат моделирования
|
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы
Математический аппарат моделирования
Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
|
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
|
|
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
|
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
|
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|