Достаточно ли Intptr при сортировке для переноса интерфейса c ++ (все абстрактного), который работает путем передачи дескрипторов интерфейса? - PullRequest
1 голос
/ 27 июля 2010

Я пытаюсь обернуть неуправляемый интерфейс c ++, состоящий из нескольких абстрактных структур (со всеми чисто виртуальными методами) и небольшого фабричного пространства имен, которое возвращает дескрипторы (shared_ptrs) этим структурам.

Кажется, что, потому чтоиз этого я мог бы обойтись простым маршалингом указателей через типы System.IntPtr (хотя они имеют тип boost :: shared_ptr, это будет нормально или мне нужна дополнительная обработка?) и передачей их простым управляемымобертки, а затем вернуться в нативный код без необходимости беспокоиться о том, на что они указывают.Это на правильном пути?

Буду признателен за любую помощь или ссылки на сортировку данных с помощью pinvoke для типов STL или типов shared_ptr (все, что я могу найти, - это очень мало на MSDN и других сайтах со строками и структурами примитивов)..)

Спасибо,

Ответы [ 2 ]

2 голосов
/ 27 июля 2010

Я рекомендую определить C API для использования на уровне .NET. Используйте void * или const void * для типов "handle" ваших структур и определите функцию extern "C" для каждого из методов (включая фабричные методы и деструктор). Вы не можете маршалировать аргумент shared_ptr<T> напрямую, поэтому вам нужно использовать дескрипторы void *.

На уровне .NET сначала определите тип, производный от SafeHandle, единственная цель которого - правильно расположить дескриптор (т.е. вызвать C API, представляющий деструктор объекта). Затем определите тип оболочки, который представляет реальный объект и имеет методы для каждой из функций API C, которые представляют функции-члены объекта. Наконец, определите тип фабрики, который включает методы фабрики C API.

Это много работы, но это правильный способ сделать это.

0 голосов
/ 27 июля 2010

С COM вы можете только маршалировать / демаршировать типы данных COM -> ваш интерфейс должен быть конвертируемым в COM (см. this для примера построения COM-объекта в C ++).

Это не означает, что при реализации интерфейса вы не можете использовать типы stl или boost, просто ваше определение интерфейса должно состоять только из конвертируемых COM-типов.См. this для получения списка типов данных C ++ и их COM-эквивалента.

Если вы будете использовать COM-объект, вам не потребуется PInvoke из .net, так как вы можете напрямую импортироватьCOM-объект в .net из Visual Studio (Добавить ссылку-> COM).

Вам необходимо использовать PInvoke, если вы делаете прямые вызовы неуправляемого кода.См. this для начала на PInvoke.См. этот вопрос для обсуждения вызова неуправляемого кода, использующего контейнеры STL.

...