Каков наилучший способ определить этот нативный интерфейс для .NET-потребления? - PullRequest
2 голосов
/ 14 марта 2012

У меня есть библиотека, функциональность которой я хочу в конечном итоге открыть для .NET. Метод, который я хочу раскрыть, имеет следующую подпись:

void DoSomething(std::list<SomeStruct>& someList);

Переменная someList заполняется DoSomething.

Я уже знаю, как экспортировать из библиотеки. Мой главный вопрос - как будет выглядеть интерфейс для .NET для этой функции? Я бы предположил, что std::list - плохая идея, если я хочу использовать C # с P / Invokes.

Какие еще есть варианты? Как вызывающая сторона, я не буду знать размер буфера, который я должен передать заранее. Кроме того, как вызывающая сторона, я бы предпочел не делать многократные вызовы функции с небольшими буферами фиксированного размера и не хотел бы передавать в очень большой буфер.

Какая лучшая практика для этого случая?

1 Ответ

2 голосов
/ 14 марта 2012

Вы можете определить структуру для использования в вызове pinvoke.Украсьте его на родной и переставленной сторонах, чтобы упаковка была одинаковой с каждой стороны.Что касается параметра out size size, вы можете использовать :: GlobalAlloc для выделения массива, который затем можно освободить в C #.Также раздайте количество предметов.В C # тип Marshal имеет различные методы для работы с массивом GlobalAlloc.

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