Как передать массив структур из c ++ в c #? - PullRequest
0 голосов
/ 27 сентября 2019

Я изучал это некоторое время, но не могу найти решение.

Я пишу программу, которая использует оболочку c ++ / CLI.Моя цель сейчас - вернуть список всех запущенных процессов и их PID (среди прочего) в c #.У меня есть работающая функция C ++, которая возвращает вектор типа PROCESSENTRY32, но не имею ни малейшего понятия, как получить эту информацию в c #.

Я знаю, что в c # есть функция для получения всех запущенных процессов,но я пытаюсь сделать это на с ++.

Любые советы или указатели в правильном направлении были бы хороши.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Во-первых, настройте API для приложения c # для доступа к данным.Объявите свои функции API с __declspec(dllexport) непосредственно перед тем, как ваши функции C ++ возвращают тип.Использование #define для этого может быть удобно.

В C # land убедитесь, что вы используете System.Runtime.InteropServices; Затем создайте дескриптор статического метода для вашего API, используя атрибут метода [DllImport("dll_name.dll", CharSet = CharSet.Unicode)] для вашего метода, затем static extern returnType CallCPPFunction(); Вам придется написать собственный анализатор данных, используя этот метод, поскольку возвращаемые данные - это просто набор байтов (то есть C # будет пытаться преобразовать полученные данные из C ++ в качестве типа возврата, который вы указываете в C #).Вы можете создать структуру в C #, построенную из байтового массива, и установить ее как параметр конструктора, однако вы можете значительно упростить свою работу, отправив один или несколько int* в качестве параметров в функцию C #, которая содержит полезные данные, такие какsizeof(object) или значимые маркеры в данных объектов для облегчения анализа.Имейте в виду, что память здесь одновременно управляется C # и C ++, поэтому, если вы передадите int* с sizeof(object), вам все равно потребуется delete этот указатель в C ++, но убедитесь, что вы ничего не делаетенапример, когда C # или C ++ все еще используют данные.Вы могли бы создать некоторый unsafe код в C #, где C ++ передает bool *, который начинается как false, а затем C # помечает его как true, когда он завершил чтение данных.

Я не эксперт в этом бизнесе Marshalling, но я успешно использовал этот точный метод передачи данных в прошлом.Вполне возможно, что есть какой-то способ использовать типы C ++ в C #, так что этот разбор данных не требуется, или C # каким-то образом использует файлы .h для выполнения каких-либо задач, но если это так, я этого не знаю.Вот учебник, который я посмотрел, чтобы понять концепцию сам, но он немного длинный, и я не смог найти другой, который был бы тем же самым, что я искал:

https://www.youtube.com/watch?v=w3jGgTHJoCY

Если я не ошибаюсь, синтаксический анализ данных даже не понадобится, если вы заново создадите структуру C ++ в C # так, что первый определенный элемент данных будет таким же связанным элементом данных в структуре C #, второй член C ++ длявторое место в C # и т. д. Имейте в виду, что размер типов данных должен совпадать, иначе данные будут смещены, как только они попадут в элемент данных, размер которого в C ++ и C # не совпадает.Если ваша структура содержит подтипы, вам нужно будет заново создать их и в C #;вплоть до уровня примитивного типа.

0 голосов
/ 27 сентября 2019

например, смените вектор на новый список, и когда размер или значение вектора изменилось, уведомление с помощью кода c # для уведомления обновляет элемент списка (может быть, вы можете использовать событие для уведомления), это может решить вашу проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...