Совместимость C ++ и C #: P / Invoke против C ++ / CLI - PullRequest
12 голосов
/ 30 июня 2010

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

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

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

  • Похоже, что для использования P / Invoke я должен предоставить API в стиле C. Это правда? Я имею в виду, есть ли способ экспортировать объект C ++ в C #, как SWIG с P / Invoke? Или я должен использовать SWIG для этой цели?
  • Насколько сложно изменить C ++ на C ++ / CLI? Стоит ли пытаться по сравнению переписать C ++ на C #? C ++ хорошо спроектирован, поэтому его реализация на C # не так уж и хороша.
  • (не по теме) Есть ли обратный путь? Я имею в виду, если я хочу использовать код C # из C ++, есть ли способ сделать это?

Ответы [ 4 ]

19 голосов
/ 30 июня 2010

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

5 голосов
/ 30 июня 2010

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

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

3 голосов
/ 30 июня 2010

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

0 голосов
/ 10 июля 2017

Оберните ваши собственные классы C ++, как указатель на реализацию, в классы C ++ / CLI, затем вызовите и используйте эти классы на основе CLR, «используя» их в вашем приложении .net.Это мой рекомендуемый способ.НЕ ПЕРЕПИСЫВАЙТЕ свои существующие классы в C ++ / CLI.

...