Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/49: Рейтинг темы: голосов - 49, средняя оценка - 4.63
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308

Обмен данными между c++ dll и c# приложением

01.03.2012, 20:51. Показов 9927. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу программу, в которой требуется много Win32 Api вызовов. Препод сказал, что активное использование последних понижает производительность приложения, потому нужно написать dll на плюсах и всю логику реализовывать там (а на шарпе ваять интерфейс).
Логика приложения требует от функции выполнения в фоновом режиме, при этом ей необходимо периодически отправлять информацию в приложение. Вот, собственно, и вопрос: как это реализовать?

Была идея в библиотеке создать не набор функций, а класс. В этом классе хранить данные и набор методов. При необходимости считывать данные из класса, используя методы последнего. Однако, мне не удалось найти, как это реализовать (в плане импорта в шарповском коде)

Была идея использовать именованный пайп. Но на шарпе он реализуется только через Win32 Api, т.е. нужно импортировать эти функции в шарп, а с этим я и борюсь

Файл или реестр - неудобно.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2012, 20:51
Ответы с готовыми решениями:

Как организовать обмен данными между WPF и консольным приложением?
В решении 2 проекта, WPF App и Console App, работают они одновременно при выполнении в консоли команд, должны обновляться данные в...

Обмен данными между приложением на C# и Python
Обмен данными между приложением на C# и Python Здравствуйте, недавно стал изучать C#, и понадобилось обмениваться данными между Python...

Обмен данными между веб-приложением (Flask) и графическим приложением (PyQt5) (Python3.7)
С помощью каких библиотек (модулей) и каким образом можно реализовать сервер на базе графического приложения сделанного с помощью...

12
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
01.03.2012, 23:54
Лучший ответ Сообщение было отмечено _lunar_ как решение

Решение

источника к сожалению найти не смог, но не так давно попалась мне одна интересная сборка WinAPI на C#, компилируйте её в dll и подключайте к проекту, или используйте отдельно классы. Выложу, может пригодится. Всё же легче чем писать библиотеку на С++ и потом импортировать из неё функции тем же API.
Вложения
Тип файла: zip win32_src.zip (84.5 Кб, 162 просмотров)
0
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
02.03.2012, 10:57  [ТС]
_lunar_, спасибо за код.
к сожалению, это не то что мне нужно в данный момент
Цитата Сообщение от _lunar_ Посмотреть сообщение
Всё же легче чем писать библиотеку на С++ и потом импортировать из неё функции тем же API.
тут вопрос не в лёгкости, а в том, что, используя с++ библиотеку, я импортирую пару функций из и сделаю по паре вызовов каждой, а при импорте API мне придётся импортировать и вызывать на порядок больше.

Добавлено через 1 час 18 минут
я нашёл!
мою задачу можно решить через file maping (именованный):
в C# используется класс MemoryMappedFile
в С++ - CreateFileMaping, OpenFileMaping и т.д.

синхронизировать можно семафорами (тоже именованными)
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
02.03.2012, 13:08
А через маршалинг нельзя ?

C++
1
2
3
4
5
6
7
8
9
#define DLLEXPORT extern "C" __declspec(dllexport)
typedef void (*MANAGEFUNC)(void);
 
DLLEXPORT void __stdcall AsyncFunc(MANAGEFUNC callback)
{
    ///что то выполняем, создаем отдельный поток если нужно, после выполненния которого вызываем callback
        Sleep(4000);
    callback();
}

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    class Program
    {
        [DllImport("Win32DLL.dll")]
        public static extern void AsyncFunc(Action callback);
 
        static void Main(string[] args)
        {
            var task = Task.Factory.StartNew(() => { AsyncFunc(() => 
            {
                //нативная функция отработала, и известила нас о результатах
                Console.Write("callback");
            }); });
 
            Console.ReadLine();
        }
    }

мою задачу можно решить через file maping (именованный)
- это хорошо если между процессами нужен обмен, но тогда проще Rpc каналы заюзать.
1
47 / 47 / 6
Регистрация: 09.11.2010
Сообщений: 308
02.03.2012, 19:54  [ТС]
не совсем понял про маршалинг. Console.Write("callback"); будет выполнена после завершения потока?

можно по подробней про RPC каналы
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
02.03.2012, 21:30
Логика приложения требует от функции выполнения в фоновом режиме
Console.Write("callback"); будет выполнена после завершения потока?
- будет вызвана из потока C++ dll-ки когда тебе необходимо., фоновый поток можно создавать как со стороны NET-а, так и со стороны неуправляемого кода., в текущем примере на стороне NET приложения.

можно по подробней про RPC каналы
- ну тут это тоже как бы лишнее, у тебя же нативная dll подгружается в текущее приложение ? а вообще вот:
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
 Аватар для sau
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
 Аватар для sau
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
 Аватар для sau
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 минуту
для передачи функции с параметрами, нужно вызываемой функции передавать делегат (а не объект шаблонного класса):
C#
1
2
3
4
5
[return: MarshalAs(UnmanagedType.I1)]
public delegate bool foo([MarshalAs(UnmanagedType.I4)]int val);
 
[DllImport( "library.dll" )]
static extern int my_func( [MarshalAs(UnmanagedType.FunctionPtr)] foo f, int val );
а в с++ коде передаваемую функцию нужно объявит как __stdcall:
C++
1
typedef bool __stdcall FUNC(int val);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.03.2012, 20:25
Помогаю со студенческими работами здесь

Обмен данными между BackgroundAudioPlayer и своим приложением
В общемто задача такая. Пишу программу, играет различное потоковое мультимедия, аудио видео и прочее. Когда засовываю аудио в Бэкграунд...

Обмен данными между Excel и приложением с применением dde
Здраствуйте, помогите ,пожалуйста, нужно написать программу обмена данными между программой excel и delphi с помощью технологии DDE (с...

Java DB/Derby обмен данными с приложением
Есть простое приложение JavaApplication. Необходимо соединить его с базой данных Derby и произвести обмен данными. Ввести данные из...

Обмен сообщениями между приложением и устройством
Приветствую! Обмен сообщениями будет между приложением и устройством(имеет заводской ip). Где нужно использовать ip моего ПК и ip...

Обмен между мобильным приложением и базой 1С
При запуске обмена данными с мобильного клиента вылетает ошибка разбора XML файла. (во вложении скриншот) Эта ошибка появляется, когда я...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru