C ++ / CLI + Boost + Mono - PullRequest
       35

C ++ / CLI + Boost + Mono

1 голос
/ 02 ноября 2010

Общие сведения: у меня есть совместимый со стандартами API C ++, который использует библиотеки Boost, которые я хотел бы поддерживать в качестве встроенной, статически связываемой библиотеки в Windows, OS X и Linux, и которую я хотел бы обернуть для .NET в Windows и Mono в OS X и Linux.

Особенности: в настоящее время он компилируется изначально для всех платформ - это следовало из использования стандартных C ++ и Boost. Я также получил его для компиляции и запуска для C ++ / CLI в Windows, но я был вынужден использовать Boost .DLL. Следующий шаг, я не уверен, с чего начать, так как я никогда не пытался использовать разделяемые библиотеки в системах * nix. Я знаю, что Boost предоставляет совместно используемые библиотеки в Linux (и я предполагаю, что то же самое верно и в OS X), но будут ли они просто автоматически работать с моим исполняемым файлом C ++ / CLI, скомпилированным в Visual Studios, или мне нужно будет поработать? Для MonoDevelop нет компилятора C ++ / CLI, но предположительно скомпилированный CLI Visual Studios будет работать просто отлично ... меня смущают динамически связанные библиотеки.

Ответы [ 4 ]

7 голосов
/ 02 ноября 2010

C ++ / CLI сборки будут загружаться только в Mono, если они скомпилированы с /clr:pure. Сборка C ++ / CLI в смешанном режиме (любая сборка, использующая собственный код, например, boost) не будет работать на платформах, отличных от Windows.

Лучший вариант - предоставить C API и использовать P / Invoke для вызова нативного кода. Это переносимо для всех платформ, при условии, что вы включаете один и тот же C API на обеих платформах.

2 голосов
/ 17 февраля 2012

Я уверен, что вы уже нашли другое решение, но я уверен, что этот вопрос все еще появляется в поисках.

В последнее время Mono добилась значительных успехов в совместимости с C ++ в CXXI ​​.

Из этой публикации рассказывается, что новая технология CXXI ​​позволяет разработчикам C # /. NET:

  • Легко использовать существующие классы C ++из C # или любого другого языка .NET
  • Создание объектов C ++ из C #
  • Вызов методов C ++ в классах C ++ из кода C #
  • Вызов встроенных методов C ++ из кода C # (при условии, чтобиблиотека скомпилирована с -fkeep-inline-functions или что вы предоставили суррогатную библиотеку)
  • Подкласс C ++ классы из C #
  • Переопределение методов C ++ методами C #
  • Предоставление экземпляровКлассы C ++ или смешанные классы C ++ / C # для кода C # и C ++, как если бы они были нативным кодом.

CXXI ​​- результат двух лет работы Google Summer of Code дляподопечные улучшения совместимости Mono с языком C ++.

1 голос
/ 02 ноября 2010

Вы действительно не можете сделать это в C ++ / CLI, потому что C ++ / CLI не является C ++. Как говорит Рид, вам нужно будет скомпилировать, используя /clr:pure, что заставит вас удалить замену каждого отдельного класса с классом CLR, и это, по сути, лишит смысла попытки компиляции там.

Почему вы пытаетесь это сделать?

0 голосов
/ 02 ноября 2010

Имейте в виду, что .net придерживается " Fusion " как модели для поиска библиотек (которые в .net, по сути, все динамически связаны).На платформе Windows собственный код не соответствует модели загрузки Fusion.Проверьте документацию LoadLibraryEx , прочитав, где написано:

Функция LoadLibraryEx выполняет стандартный поиск модулей, если имя файла указано без пути, а базовое имя файла -не соответствует базовому имени файла загруженного модуля, или указан путь, но LOAD_WITH_ALTERED_SEARCH_PATH не используется.

... и следующие абзацы.Способ, которым я построил C # для C ++ / CLI, состоит в том, чтобы мой загрузчик C # проверял, является ли он в настоящий момент JITted как x86 или x64, а затем я явно загружаю сборку C ++ / CLI, соответствующую этой архитектуре.Если вы этого не сделаете, то не сможете скомпилировать как AnyCPU на стороне C #.

Как это работает вне Windows, я не знаю ...

...