|
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55
|
|
Межпроцессное взаимодействие C# <-> интерпретатор Lua01.12.2025, 20:06. Показов 3024. Ответов 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# написать интерпретатор Можно ли написать простейший интерпретатор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Мобильное приложение 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 и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|