Во-первых, настройте 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 #;вплоть до уровня примитивного типа.