Структура передачи C# с интерфейсом для неуправляемого C

#c# #c

Вопрос:

У меня есть неуправляемая библиотека DLL C и некоторый код C#, который использует [dllimport] для доступа к ней. У меня есть структура, производная от интерфейса (скажем, Собака : Животное), а на стороне C у меня есть класс, производный от абстрактного класса (скажем, Собака : общественное животное). Я хочу иметь функцию C , которая каким-то образом принимает Animal в качестве параметра, чтобы я мог передавать Dog из C# (поскольку вы не можете использовать абстрактные классы в качестве параметров в C ).

Ответ №1:

Одним из вариантов было бы использовать c /cli для определения вашей объектной модели. Это сделало бы его доступным как для кода c#, так и для кода c /cli.

P/invoke по сути выполняет вызовы методов так же, как и C. Это означает, что они хорошо совместимы между разными языками, но также и то, что они не поддерживают такие вещи, как полиморфизм.

Структура-это, по сути, просто фрагмент данных как на C#, так и на C, вам просто нужно убедиться, что макет одинаков. Но как только вы начинаете использовать наследование, все становится намного сложнее, поскольку c# и c представляют объекты совершенно по-разному.

Тем не менее, вы все равно можете создать метод c , который берет структуру dog из c# и преобразует ее в эквивалентный тип c .