|
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
|
|
Обмен данными между c++ dll и c# приложением01.03.2012, 20:51. Показов 9927. Ответов 12
Метки нет (Все метки)
Пишу программу, в которой требуется много Win32 Api вызовов. Препод сказал, что активное использование последних понижает производительность приложения, потому нужно написать dll на плюсах и всю логику реализовывать там (а на шарпе ваять интерфейс).
Логика приложения требует от функции выполнения в фоновом режиме, при этом ей необходимо периодически отправлять информацию в приложение. Вот, собственно, и вопрос: как это реализовать? Была идея в библиотеке создать не набор функций, а класс. В этом классе хранить данные и набор методов. При необходимости считывать данные из класса, используя методы последнего. Однако, мне не удалось найти, как это реализовать (в плане импорта в шарповском коде) Была идея использовать именованный пайп. Но на шарпе он реализуется только через Win32 Api, т.е. нужно импортировать эти функции в шарп, а с этим я и борюсь Файл или реестр - неудобно.
0
|
|
| 01.03.2012, 20:51 | |
|
Ответы с готовыми решениями:
12
Обмен данными между приложением на C# и Python Обмен данными между веб-приложением (Flask) и графическим приложением (PyQt5) (Python3.7) |
|
|
|
| 01.03.2012, 23:54 | |
Сообщение было отмечено _lunar_ как решение
Решение
источника к сожалению найти не смог, но не так давно попалась мне одна интересная сборка WinAPI на C#, компилируйте её в dll и подключайте к проекту, или используйте отдельно классы. Выложу, может пригодится. Всё же легче чем писать библиотеку на С++ и потом импортировать из неё функции тем же API.
0
|
|
|
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
|
||
| 02.03.2012, 10:57 [ТС] | ||
|
_lunar_, спасибо за код.
к сожалению, это не то что мне нужно в данный момент ![]() Добавлено через 1 час 18 минут я нашёл! мою задачу можно решить через file maping (именованный): в C# используется класс MemoryMappedFile в С++ - CreateFileMaping, OpenFileMaping и т.д. синхронизировать можно семафорами (тоже именованными)
0
|
||
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
||||||||||||
| 02.03.2012, 13:08 | ||||||||||||
|
А через маршалинг нельзя ?
1
|
||||||||||||
|
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
|
|
| 02.03.2012, 19:54 [ТС] | |
|
не совсем понял про маршалинг. Console.Write("callback"); будет выполнена после завершения потока?
можно по подробней про RPC каналы
0
|
|
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
||||
| 02.03.2012, 21:30 | ||||
http://msdn.microsoft.com/ru-r... w6576.aspx Добавлено через 10 минут Вот статейка по твоей теме: http://www.rsdn.ru/article/dot... nterop.xml
0
|
||||
|
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
|
|
| 03.03.2012, 00:22 [ТС] | |
|
я пишу прогу, которая будет контролировать автозагрузку. на с++ у меня будут мониториться ключи реестра. при изменении соответствующих ключей, у пользователя будет спрашиваться, действительно ли он этого хочет. при чём, при изменении реестра, в с++ коде будут эти изменения находиться, сохраняться в память информация о них и из реестра удаляться, а в с# коде будет формироваться окошко: "так и так, нашёлся мальчик, брать будете?". и при утвердительном ответе данные буду возвращаться в реестр.
я нашёл, что данными можно обмениваться через file maping, а сигнализировать о том, что что-нибудь случилось - через семафоры. однако, получается, что с++ код должен создавать отдельный поток и c# код тоже должен создавать отдельный поток (один слушает реестр и при необходимости пинает семафор, а другой - ждёт пока семафор пнут и вываливает окошка). таким образом, на обработку одного ключа реестра нужно 2 потока. а этих ключей там куча! нехорошо... если я правильно понял идеи маршалинга, то я функции, вызываемой из с# кода, кроме всего прочего передаю ещё и функцию, которую потом можно вызывать из с++ кода. это -1 поток правильно я рассуждаю?
0
|
|
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
||
| 03.03.2012, 02:28 | ||
Я лишь привел один из возможных примеров взаимодействия управляемого и не управляемого кода, а создавать или не создавать потоки, передавать функцию обратного вызова или нет , и как это лучше сделать - это уже сами смотрите ), смысл в том что в нативном коде нужно получить ссылку на класс или функцию в управляемом коде для последующего вызова, можно реализовать враперы как в приведенной выше статье или сразу передать указатель на функцию из c# кода. Если у вас ООП подход на стороне С++ ,то логично написать враперы для c# классов. З.Ы Еще можно заюзать Managed C++, там вроде как гибриды проще пишутся, но эт так , для справки ).
0
|
||
|
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
|
|
| 03.03.2012, 02:38 [ТС] | |
|
вы натолкнули меня на множество разных мыслей. нужно всё обдумать
0
|
|
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
|
| 03.03.2012, 02:43 | |
|
Кстати, насчет реестра, если задача только в этом то в NET есть все необходимое для работы с ним, так что может не так уж и много у вас апишных вызовов получиться, и огород городить не стоит ). - разве что чисто в образовательных целях для препода.
0
|
|
|
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
|
|
| 03.03.2012, 02:56 [ТС] | |
|
я на самом деле так и хотел, но мне препод сказал делать через библиотеку
возможно я вообще буду изначально делать всё на с++, а на интерфейс буду подключать (а не наоборот, как было задумано изначально). можно ли с помощью враперов запихнуть в с++ код WPF форму?
0
|
|
|
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
|
|
| 03.03.2012, 03:11 | |
|
Можно вызывать CLR из натива, и там юзать уже сборки, правда делается это через опу...
http://support.microsoft.com/kb/953836 Тогда действительно пиши на Managed C++. будет тебе натив и манаджед в одном флаконе.
0
|
|
|
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
|
|||||||||||
| 05.03.2012, 20:25 [ТС] | |||||||||||
|
sau, насчёт маршалинга:
если я передаю в импортируемую функцию в качестве параметра тип Action (как в вашем примере), то всё нормально работает. А если пытаюсь передать делегат возвращающий или принимающий что-нибудь, то получаю исключение MarshalDirectiveException как можно передать функцию, возвращающую или принимающую значение Добавлено через 23 часа 31 минуту для передачи функции с параметрами, нужно вызываемой функции передавать делегат (а не объект шаблонного класса):
0
|
|||||||||||
| 05.03.2012, 20:25 | |
|
Помогаю со студенческими работами здесь
13
Обмен данными между BackgroundAudioPlayer и своим приложением Обмен данными между Excel и приложением с применением dde Java DB/Derby обмен данными с приложением Обмен сообщениями между приложением и устройством Обмен между мобильным приложением и базой 1С Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|