Здравствуйте, Shmj, Вы писали:
S>Смотря какой C++-код генерит — в этом вопрос.
Вот именно.
S>Если на работало — значит C++ -код был завязан на POSIX или еще что, чего в моб. не было.
Вот именно.
S>Для доступа из других языков обязательно делать C-обертку.\
Перед обёрткой нужно провести кастрацию библиотеки.
S>Но на .Net вы и этим не сможете проблему решить.
И с чего бы это вдруг?
S>В extern "C" нужно привести все к формату простого C. Шаблоны на верх не выдавать, исключения перевести в коды ошибок, вместо объектов — либо указатель голый либо даже хандлер.
Отож. "Привести к формату" можно только то, что приводится к формату. Ну не сможете вы STL привести к формату простого C.
S>Т.е. внешний API должен быть упрощенном виде и этого достаточно. А уже внутренне можете все фишки C++ -а юзать.
Нет, не можете. В обратную сторону всё работает точно так же — если у вас есть коллбэк, то он тоже ограничен. Я же вам пишу, а вы не читаете — попробуйте передать в С-шный qsort джавовскую коллекцию и кастомный компаратор, написанный на джаве. Более того — вы не можете передавать в qsort коллбэк, написанный на полном С++. Не получится выбросить исключение из коллбэка и поймать его в своём коде, вызывающем qsort. Упс, то есть в коде библиотеки вы не можете использовать "все фишки С++" — придётся ограничиться C-совместимыми. Про управление памятью я вам уже писал — либо выставлять наружу свои аналоги malloc/free, либо, наоборот, получать их снаружи.
Не получится вернуть "смарт поинтер", который гарантированно уничтожит объект после выхода из области видимости. Всё. Ничего от вашего С++ не осталось. Борьба с С++ за совместимость с C настолько малоприятна, что проще с самого начала писать библиотеку на С.
S>На C# вы этого под все 6 платформ сделать не сможете.
Да почему не смогу-то? Упорствуете в заблуждениях.
Точно так же смогу, написав C-шную обёртку. С теми же жертвами. Да, в конце концов, неважно, что будет за обёртка — если уж мы взялись оборачивать обёртками, кто мне запретит выставить мою "библиотеку" в виде REST-сервиса? Запустил себе приложение — и вызывай его через HTTP. А уж возможность вызывать REST есть даже на большем количестве платформ и языков, чем умеющих импортировать C-шные динамические и статические либы.