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