Действительно ли Intptr достаточен при маршалинге для обертывания интерфейса C++ (весь краткий обзор), который работает путем передачи интерфейсных дескрипторов?

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

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

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

Спасибо,

1
задан Palace 27 July 2010 в 01:59
поделиться

2 ответа

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

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

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

2
ответ дан 2 September 2019 в 22:43
поделиться

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

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

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

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

0
ответ дан 2 September 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: