C++ и совместимость C#: P/Invoke по сравнению с C++ / CLI

В ходе нахождения способа взаимодействовать между C# и C++ я нашел эту статью, которая объясняет о P/Invoke.

И я прочитал много статей, утверждая, что C++ / CLI не является точным C++ и требует некоторого усилия изменить из исходного кода C++.

Я хочу спросить, что было бы оптимальным путем, когда у меня есть некоторые объекты C++ (код, который я хочу использовать от объектов C#.

  • Похоже, что для использования P/Invoke, я должен обеспечить, C разрабатывают API. Действительно ли это верно? Я имею в виду, там способ экспортировать объект C++ в C# как БОЛЬШОЙ ГЛОТОК с P/Invoke? Или, я должен использовать БОЛЬШОЙ ГЛОТОК с этой целью?
  • Как трудно это должно изменить C++ на C++ / CLI? Действительно ли это стоит попробовать сравненный для перезаписи C++ к C#? C++ хорошо разработан, таким образом реализование его к C# не много.
  • (От вопроса о теме), там наоборот? Я имею в виду, если я хочу использовать код C# от C++, есть ли какой-либо способ сделать так?

12
задан prosseek 30 June 2010 в 15:19
поделиться

3 ответа

Я бы не рекомендовал переписывать вашу библиотеку C ++ в C ++ / CLI. Вместо этого я бы написал оболочку C ++ / CLI, которую вы можете вызывать из C #. Он будет состоять из некоторых классов public ref class , каждый из которых, вероятно, просто управляет экземпляром собственного класса. Ваша оболочка C ++ / CLI просто «включает заголовок, ссылку на библиотеку», чтобы использовать собственную библиотеку. Поскольку вы написали классы общедоступного ссылочного класса , ваш код C # просто добавляет ссылку на .NET. И все, что вы делаете внутри каждого общедоступного ссылочного класса, - это используете C ++ Interop (он же It Just Works interop) для вызова собственного кода. Если хотите, вы можете нанести фасад прямо на него.

19
ответ дан 2 December 2019 в 05:39
поделиться

Синтаксис C ++ / CLI неудобен, но он позволяет вам открывать управляемые объекты из кода C ++. Это может быть удобно, если у вас есть большой API C ++ и вы можете абстрагировать некоторые из этих функций до более простого интерфейса для использования вашим управляемым кодом. Я успешно сделал это для интеграции с такими инструментами, как библиотека Matrox vision, где я мог написать свой код анализа зрения на C ++, а затем использовать расширения C ++ / CLI для предоставления высокоуровневых управляемых классов. Самая болезненная часть, вероятно, - это взаимодействие строк и массивов, но строки всегда были болезненными, даже в простом C ++.

C ++ / CLI определенно может потреблять любые управляемые объекты .NET, но вы должны проявлять особую осторожность, если используете какие-либо указатели на управляемую память (в этом случае вам нужно будет использовать закрепление). Если мне нужно передать указатели на API, я обычно предпочитаю оставлять эту память неуправляемой, а затем создавать управляемые классы-оболочки для управления неуправляемой памятью.

5
ответ дан 2 December 2019 в 05:39
поделиться

В дополнение к ответу Кейт Грегори, чтобы вызвать код C # из C ++, использование C ++ / CLI - очевидный способ сделать это, поскольку он делает его чрезвычайно простым и бесшовным.

3
ответ дан 2 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

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