fisadmaster Ответов: 2

Как отправить номер из формы на языке C# в консольную программу на языке C++


Мне нужно запустить неуправляемое приложение C++, это приложение должно быть подключено к библиотеке в C# (dll, которая при загрузке должна показывать форму с кнопкой) и ждать завершения события закрытия формы.

Пока форма загружается, в момент нажатия кнопки должно быть выполнено событие click, которое должно выполнить функцию, которая может отправить номер возврата в консольное приложение на языке C++, и это приложение покажет результирующее число в выводе консоли.

Что мне нужно, так это решить пункт 5. как показано ниже, я читаю много документов, но почти все они относятся к взаимодействию между Библиотекой DLL C++ и приложением C#, а не наоборот (возврат целочисленного значения из библиотеки dll C# в консольное приложение C++).

Выполнение должно быть динамическим, то есть при отображении формы должна быть установлена связь между функцией библиотеки C# и функцией родительского консольного приложения C++.

Все примеры, которые мне удалось найти, делают почти то же самое, загружают библиотеки, устанавливают связь и из консольного приложения C++ вызывают функцию библиотеки C# и показывают результирующее возвращаемое значение, и приложение заканчивается, но ни один пример не показывает, как загрузить библиотеку C#, показать форму, нажать кнопку и отправить целое число в результате в родительское консольное приложение C++ и показать результат в выводе консоли.

Если у вас есть какие-либо идеи, как реализовать обратный вызов, я был бы очень благодарен.

Что я уже пробовал:

То, что было достигнуто, - это:

1. Загрузка консольного приложения C++ (неуправляемого), достигнутая
2. Загрузите библиотеку C# из консольного приложения C++, достигнув
3. Импорт и общаться с некоторыми функции, экспортируемые из библиотеки C#, достигнутый
4. При загрузке библиотеки C#, из этой библиотеки отображается форма с кнопки, достигнутый
5. в то время как форма отображается, нажмите кнопку и выполните функцию в C#, которая возвращает целое число в консольное приложение C++ и печатает результат в выводе консоли из консольного приложения C++ в ожидании

Richard MacCutchan

Это звучит как большая работа, чтобы сделать что-то, что, скорее всего, может быть достигнуто более легко. Почему бы не создать консольное приложение на языке C#, которое могло бы легче взаимодействовать с библиотекой? Или приложение Windows Form, которое запускает консольное приложение с соответствующим номером?

fisadmaster

@Richard MacCutchan, это требование установлено таким образом, потому что оно должно выполнять различные операции между неуправляемым приложением C++ и библиотекой на C#, и необходимо проверить совместимость между языками для будущих реализаций

Richard MacCutchan

Хорошо, тогда вам нужно установить обработчик событий в библиотеке, который может вызвать консольное приложение. Что, скорее всего, потребует некоторого кода C++/CLI между ними.

2 Ответов

Рейтинг:
1

Richard MacCutchan

Более подробную информацию по этому вопросу вы можете найти на сайте Родной и .Объем оперативной совместимости[^].


fisadmaster

Вы правы с кодом C++/CLI, но я уже сделал много примеров, но все они статического типа, вызов функции в библиотеке C# и возвращаемое значение, но нет примера того, как ожидать динамического ответа, то есть более одного раза для каждого выполнения, как слушатель из неуправляемого C++

Richard MacCutchan

Я не знаю другого способа сделать то, что ты хочешь. Может быть, лучше воспользоваться услугой передачи сообщений или посмотреть на возможность использования каналов.

Рейтинг:
0

KarstenK

Читай мой анализ возможных осложнений о совместимости чтобы понять механизм.

Вы можете добавить какой-то дополнительный слой, например дополнительный поток, или какой-то механизм ожидания, например семафоры в приложении C++, который ждет взаимодействия и затем работает дальше.

Это звучит немного утомительно, я думаю, вам действительно следует пересмотреть дизайн - если это возможно. ;-)


fisadmaster

Спасибо за комментарий, но мне нужно противоположное тому, что описано в вашей статье, мне нужно загрузить dll C#, которая показывает форму, и при нажатии кнопки, расположенной в этой форме, целое число должно быть отправлено обратно в приложение C++, которое загрузило библиотеку C#, и esdta должна показать результат в консоли (я думаю, что это обратный вызов с C ++ на C #).

Вы импортируете функции C ++ в приложение C#, мне нужно реагировать с C # на неуправляемый C ++

KarstenK

попробуйте: https://www.codeproject.com/articles/6916/how-to-load-a-dynamic-link-library-dll-into-a-micr

Проблема может заключаться в том, что dll не может показывать пользовательский интерфейс.

fisadmaster

Спасибо за данные, но эта статья предназначена для C++ to C++, а не для C++ to C#.