Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55

Межпроцессное взаимодействие C# <-> интерпретатор Lua

01.12.2025, 20:06. Показов 3400. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.12.2025, 20:06
Ответы с готовыми решениями:

Межпроцессное взаимодействие WCF
Здравствуйте ツ Пишут, что для межпроцессного взаимодействия можно использовать WCF. Нигде не нашёл...

Межпроцессное взаимодействие
Здравствуйте. Есть необходимость перебрасывать информацию между двумя приложениями. Для этого...

Межпроцессный обмен пакетами данных
Собственно вопрос. Как отправить пакет в приложение? Опять же онлайн игра. Нужна пакетная...

43
Эксперт .NET
 Аватар для Usaga
14790 / 9563 / 1367
Регистрация: 21.01.2016
Сообщений: 36,058
04.12.2025, 15:56
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Tupiel Reuschin Посмотреть сообщение
При загрузке DLL на C++ она инициализирует рантайм CLR, грузит управляемую .dll #6
Это ты про что? Кто кого инициализирует?
0
3 / 3 / 1
Регистрация: 20.06.2015
Сообщений: 55
04.12.2025, 16:07  [ТС]
Цитата Сообщение от Tupiel Reuschin Посмотреть сообщение
При загрузке DLL на C++ она инициализирует рантайм CLR, грузит управляемую .dll #6, выходит (обратно в Lua).
Одно из условий написания dll на C++ для капиталистического приложения - это отключение поддержки CLR-среды (писал об этом выше). Ради эксперимента попробовал нарушить это правило. На этапе сборки компилятор уже ругнулся предупреждением, что образ состояния (капиталистического приложения) не может быть изменён. Этот образ передаётся в DLL для взаимодействия (аля свой CLR). DLL загрузилась в приложение и ожидаемо подвисло. В общем, надо без CLR.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
04.12.2025, 16:14
Цитата Сообщение от andreybs1 Посмотреть сообщение
Поясните, что здесь имеете ввиду... Проект на C++ собирается в dll. А как предполагается включить в состав этой dll программу на C#?
За плюсы не шарю, поясню как это можно на C#

вариант 1

Просто добавляем зависимость и копирование exe в выходной каталог. После этого мы можем сделать следующее в коде:
- получить путь к dll С++
- относительно этого пути найти и запустить C# exe

по сути это просто организация билда проектов, чтобы всё было в куче.


вариант 2

Внедряем ресурс внутырь dll. По сути это как файл внутри файла. В момент "запуска" C++ либы внутри основного приложения, мы копируем куда-либо нужный нам C# exe и запускаем его. Есть ли resources для C++ либ -- без понятия, но это легко можно свести к обычному массиву байт или строке base64 (главное не держать в памяти на постоянке).

Более надёжный контроль соответствия версий, но куча возки с "распакуй/зачисть".

--------

Я бы в первую очередь рассматривал первый вариант. Ну и такой подход не является единственно верным. Вполне допускаю что в ряде случаев удобней будет иметь файл-конфигураций для C++ dll, в котором будет указываться путь к C# exe.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,758
Записей в блоге: 4
04.12.2025, 16:15
Цитата Сообщение от andreybs1 Посмотреть сообщение
Одно из условий написания dll на C++ для капиталистического приложения - это отключение поддержки CLR-среды (писал об этом выше).
Потому я вам и говорил про третий проект с C++/CLI, который и будет всё транслировать в/из NET.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.12.2025, 16:15

Межпроцессная архитектура приложений
Подскажите что почитать по этому поводу. К примеру - имеем браузер на основе chronium, который...

Не могу написать проект... (интерпретатор команд для управления объектом)
Синопсис В данном проекте Вам необходимо реализовать простой интерпретатор команд для управления...

Пишу интерпретатор синтаксиса аля С, использую COCO/R
Учусь в университете, на инженера программиста. По дисциплине ТЯПиМТ задали написать интерпретатор....

Можно ли на C# написать интерпретатор
Моно ли на C# написать интерпретатор? Например для питона интерпретатор написан на C ибо C быстрый...

Можно ли написать простейший интерпретатор
Добрый вечер. Задача состоит в том, чтобы например в теле программе пользователь мог написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
44
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера 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) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru