Совместное использование объектов между C # и C ++ кодом - PullRequest
1 голос
/ 22 августа 2009

Можно ли обмениваться ссылками на объекты C # между кодом C # и C ++ без большой сложности? Или это вообще считается плохой идеей?

Ответы [ 2 ]

3 голосов
/ 22 августа 2009

Лучшее решение для совместного использования объекта C # между собственным и управляемым кодом - это использование COM-взаимодействия. Это позволяет вам по существу разделять интерфейс объекта между управляемым кодом и его эквивалентной сигнатурой в C ++.

Что касается сложности вещей. Большинство сценариев взаимодействия COM просты и на самом деле не более сложны, чем старое доброе программирование COM. На управляемой стороне это выглядит действительно ничем не отличается от обычного интерфейса.

Как только вы введете несколько потоков или начнете играть между квартирами СОМ, все может стать немного сложнее.

По моему опыту, самый простой способ получить эту работу заключается в следующем.

  • Определите интерфейс в C #, который вы хотите использовать в C ++
  • Пометить интерфейс с помощью ComVisible (true) attrbute
  • Запустите tlbexp на сборке, которая создает файл TLB
  • Импорт TLB в ваш собственный проект

Это даст определение интерфейса для обоих ваших проектов. Чтобы передать это между проектами, требуется немного больше деталей в вашей архитектуре.

0 голосов
/ 24 августа 2009

Другое личное решение, которое я могу порекомендовать, исходя из личного опыта, заключается в использовании управляемого интерфейса C ++ между ними, если код C ++, к которому вы хотите получить доступ, слишком велик или слишком сложен.

Например, я использую сетевую библиотеку RakNet C ++ в проекте C #. Решения состоят в том, чтобы либо создать массивный класс-оболочку в C # для доступа к необходимым функциям C ++, создать оболочку C ++ вокруг тех функций, которые затем можно использовать в качестве взаимодействия COM, либо использовать Managed C ++ (Visual C ++ / CLI).

Я выбрал последнее, что позволяет мне использовать C ++ для доступа к библиотеке RakNet, но созданные классы можно использовать непосредственно в другом проекте .NET, как будто. Таким образом, основная логика была создана в тех классах Managed C ++, которые также позволяют мне использовать .NET Framework и некоторые из его замечательных функций. В моем проекте на C # мне просто нужно вызвать библиотеку Managed C ++, которая предоставляет мне все 20 функций, которые мне нужны для выполнения всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...