Как преобразовать / вызвать проект c ++ в / из .Net? - PullRequest
0 голосов
/ 01 апреля 2009

В настоящее время у меня есть огромный проект, который я недавно преобразовал из VC6 в 2005. Теперь я действительно хотел бы создать новый интерфейс для некоторых функций, однако основная логика программы основана на c ++. Кроме того, база кода вращается вокруг собственных метатипов и индивидуальных классов.

Лучшее решение, которое я могу придумать, - это вызов функций из dll проекта C ++. Однако это приводит к огромным инвестициям в маршаллинг данных, когда данные пересекают границы между c ++ и c #. Мне было интересно, есть ли другие альтернативы (полное переписывание не вариант).

Спасибо Рич

Ответы [ 2 ]

1 голос
/ 01 апреля 2009

Если вы хотите создать управляемый интерфейс для собственной библиотеки DLL, вам придется маршалировать данные туда-сюда. Там действительно нет способа избежать этой проблемы.

В настоящее время мы сталкиваемся с аналогичной проблемой в одном из наших текущих проектов. Подход, который мы выбрали, состоит в том, чтобы использовать PInvoke для разговора Managed -> Native. За некоторыми исключениями, мы используем только BlIntable типы PInvoke, что помогает снизить стоимость маршалинга, поскольку CLR может просто реализовать его как копию памяти.

При общении с родным -> управляемым мы используем COM-объекты. Мы пытаемся применить те же правила в отношении blittable, но мы обнаружили, что вам часто приходится включать много COM-объектов в этот сценарий, который предотвращает blittable-ness.

Принятие такого подхода сработало у нас довольно хорошо. Мы потратили немного времени на получение примитивов, определенных для сортировки данных. Но после этого сортировка стала ... рутиной из-за отсутствия лучшего слова. Это накладные расходы, но это намного дешевле, чем полное переписывание.

0 голосов
/ 01 апреля 2009

Я использовал C ++ / CLI (который раньше назывался Managed C ++) для обработки взаимодействия раньше - это может быть лучшим вариантом, чем P / Invoke, если вы уже используете C ++. Большая часть взаимодействия «просто работает», и вы получите безопасность во время компиляции вместо связывания с помощью «волосатого» времени выполнения, которое вас может интересовать или не заботить.

...