Когда я сделал это, я использовал исключительно Маршал . Это было со стандартным C для нативного кода. Я не хотел конвертировать свой код C в «управляемый C ++» или как там его называют: -)
Трудная и утомительная часть заключается в том, что вам нужно вручную упорядочить структуру данных во что-то, что отображается непосредственно в принимающую функцию C. В моем случае я должен был создать отдельные структуры для каждого класса данных C #, который я хотел отправить. По сути, вы должны преобразовать вашу красивую иерархию объектов C # в более простую форму, состоящую из структур, которые вы затем объединяете в блок памяти, который вы затем используете в качестве аргумента в вашем собственном вызове.
Вам следует использовать метод Marshal.AllocHGlobal
для выделения памяти и Marshal.StructureToPtr
для копирования структуры C # в эту память, а затем Marshal.FreeHGlobal
для ее освобождения.
Получив IntPtr (из StructureToPtr
), вы сможете просто вызвать C-dll с указателем в качестве аргумента. Обратите внимание, что структура, которую вы отправляете в свою функцию C, должна иметь ту же структуру, что и собственная структура C, иначе вы получите очень странные результаты.
Возврат данных - это почти то же самое, но вы используете противоположные функции (PtrToStructure
и т. Д.).
В любом случае, это основное.