LINUX.ORG.RU

Способы использования кода на C++ в проекте на Mono

 , , , ,


0

2

Привет, ЛОР. Сейчас будет тупняк и всякое ненужно, но кто-то здесь наверняка сможет посоветовать что-нибудь дельное.

Итак, есть набор классов на C++, есть проект на C# (Mono). Нужно как-то использовать код на C++ в этом проекте. Какие способы я вижу:

1) Обернуть все методы в extern «C», скомпилировать это всё как разделяемую библиотеку, и дальше дёргать эти методы как функции. Я так никогда не делал, прочитал о способе на StackOverflow. Думаю, получится жутко некрасиво.

2) Использовать CppSharp. Оно позволяет создавать C#-биндинги. Кто-то пользовался? Какие здесь есть подводные камни?

3) Переписать C++-код на C#. Не пойдёт, т.к. тогда нужно будет писать параллельно две версии (от плюсовой не отказываюсь).

4) Переписать C++-код на C и скомпилировать опять же как разделяемую библиотеку. Тоже не пойдёт, см. пункты 1 и 3.

Что бы вы посоветовали? Вариант «не использовать Сишарп» не подходит — его использую не я, а вот плюсокод — мой.

Использовать CppSharp. Оно позволяет создавать C#-биндинги

возьми да попробуй

в свое время писал C-обертку (не прямой биндинг C++, но похоже) для такой же задачи. В принципе работает.

dib2 ★★★★★ ()
Ответ на: комментарий от dib2

возьми да попробуй

Решил сначала спросить здесь, вдруг есть какие-то проблемы, которые проявятся не сразу.

в свое время писал C-обертку (не прямой биндинг C++, но похоже) для такой же задачи. В принципе работает.

Спасибо.

Ceiling_QB ★★★★ ()

с дотнетом не работал

но оно вроде как умеет компилировать с++ в CIL и прозрачно вызывать методы, написанные на другом языке - будь то бэйсик или кресты

Ford_Focus ★★★★★ ()

Есть ещё вариант, переписать код c# на c++, он точно подойдёт.

mashina ★★★★★ ()

Про красиво можно забыть - как только надо связывать кресты с другими языками, «красиво» кончается.

Пункт 1 неизбегаем в любом случае, без extern с ничего не сделать, т.к. name mangling, все дела. Что такое CppSharp не знаю, но могу предположить, что оно всего лишь генерит тот самый extern c бойлерплейт для связки.

А так документацию по pinvoke с примерами в руки и вперед :)

ЗЫ. Касательно стл - внутреннее устройство вызываемого кода неважно. Главное чтобы сигнатура читалась (extern C) и данные туда-обратно гонялись в примитивном виде (вплоть до сырого указателя - через это вроде бы можно и классы маршалить). Напрямую отмаршалить std::vector в с# (да и вообще куда бы там ни было) не получится. Либо я чего-то не знаю

Midael ★★★★★ ()
Последнее исправление: Midael (всего исправлений: 1)

Использовать C++-код из другого языка - это всегда боль (в отличие от C-кода; использование extern «C» фактически и делает C-код).

Есть несколько вариантов:

1) Вручную написать обертки на C. Можно в самой библиотеке все обернуть в блоки extern «C» { ... }, а можно написать отдельную библиотеку. Неудобно и много рутинной работы, но результат гарантирован.

2) Можно воспользоваться SWIG (CppSharp - из той же категории) - он сгенерирует C-обертки для C++-кода и биндинги на целевом языке (в данном случае - на C#). Качество будет хуже, чем в случае написания кода вручную, конечно же. И SWIG не всегда срабатывает.

dmitry_vk ★★★ ()
Ответ на: комментарий от asaw

Да, я ошибся тогда.

Проблема в том, что в Mono нет компилятора C++/CLI.

Ceiling_QB ★★★★ ()

Всем спасибо за ответы, теперь более-менее понятно, что делать.

Ceiling_QB ★★★★ ()

Думаю, получится жутко некрасиво.

Чтобы красиво получилось нужно ещё эти вызовы обернуть в класс аналогично плюснутому коду. CppSharp скорее всего именно так и поступает.

anatoly ()

Plain C прослойка + p/invoke.

anonymous ()

Вообще, нельзя просто так взять класс на С++ и использовать его в С#. Для этого надо делать кучу всего - extern и т.п., что выглядит достаточно громоздко и уродливо, фактически, тебе придется писать обертку. Сам никогда с таким не сталкивался, но может все-таки стоит копнуть в сторону C++\CLI?

nikolnik ★★★ ()
Ответ на: комментарий от nikolnik

Тут уже два раза сказали, что в Mono нет компилятора C++/CLI. Кроме того Mono не умееет mixed assemblies (в которых есть как IL код, так и нативный).

Begemoth ★★★★★ ()
Ответ на: комментарий от pashazz

да, выглядит он конечно (Managed C++) довольно странновато в сравнении с обычным. Удобнее использовать C# сразу, если это возможно

pashazz ★★★★ ()
Последнее исправление: pashazz (всего исправлений: 1)
Ответ на: комментарий от anonymous

Чем непортабельная?
Просто сборка нативной части потребуется отдельная

Uter ()

Выбрал первый вариант, всё оказалось совсем не так страшно, как казалось. В общем, теперь УМВР, всем спасибо за ответы.

Ceiling_QB ★★★★ ()

Managed C++ в mono есть? Если есть, то это самое простое, с наименьшим просёром в производительности.

pon4ik ★★★★★ ()
Ответ на: комментарий от Ceiling_QB

Пофик какие библиотеки, главное что бы это оставалось в реализации и не торчало наружу.

pon4ik ★★★★★ ()
Ответ на: комментарий от Ceiling_QB

Спасибо кстати за CppSharp :) Не знал про него, возможно у меня оно прокатит, после праздничков проверю.

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

Оно, кстати, вполне себе работает, я просто решил потренироваться в создании биндингов руками.

Ceiling_QB ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.