Соединение кода c ++ и c # с помощью моста c ++ / cli

У меня есть клиентское приложение в собственном коде C ++, которое использует собственные библиотеки DLL C ++. Я изучаю возможность соединения этого кода с dll c #, так как их было бы намного проще написать. Я решил написать dll-мост моста c ++ / cli, который можно загрузить с помощью LoadLibrary и который будет передавать вызовы dll c #.

Связь между клиентом и dll такова, что клиент передает указатель на объект интерфейса, через который dll затем связывается с клиентом. Я заключил этот объект в код моста c ++ / cli, чтобы код C # мог его использовать.

Мост также должен предоставлять несколько функций с помощью __declspec (dllexport) и передавать эти вызовы в dll c #, поэтому у него должен быть указатель на интерфейс C #, которому он будет передавать их. Я хотел использовать объект C # с оболочкой gcroot ‹>, но проблема в том, что я получаю циклические зависимости между этими двумя dll. C # dll должна ссылаться на dll моста, чтобы иметь возможность использовать класс-оболочку, а dll моста должна ссылаться на dll С # для использования класса интерфейса.

Я знаю, что могу использовать COM вместо обертывания объекта C # с помощью gcroot, но я бы предпочел этого не делать. Есть ли способ обойти это?


person Community    schedule 18.05.2009    source источник
comment
Разве вы не можете передавать функциональные точки / события или делегатов с C # на C ++. Я знаю, что для некоторых продвинутых таймеров вы можете легко обрабатывать события C ++ из C #.   -  person CodingBarfield    schedule 25.11.2010
comment
Я знаю, что это старый пост, но см. stackoverflow.com/questions/13293888/ для получения дополнительной информации об использовании библиотек C # в неуправляемом коде через c ++ / CLI Wrapper.   -  person amalgamate    schedule 12.08.2014


Ответы (1)


Просто определите интерфейс на C ++ / CLI вместо C #. Это полностью исключает зависимость от проекта C #.

Я рекомендую думать о проекте C ++ / CLI как о не что иное, как оболочку - не определяйте там никаких новых интерфейсов. Просто возьмите то, что находится в текущем коде C ++, и оберните его в «классы ссылок», чтобы вы могли создавать и вызывать их из C #.

person Reed Copsey    schedule 18.05.2009
comment
Это именно то, что я делаю - оборачиваю код С ++ в классы ссылок для библиотеки С #, чтобы использовать их. Но мост также должен переадресовывать вызовы от клиента c ++ в dll c #. Для этого мост должен использовать часть кода c # dll, следовательно, зависимость. Я не понимаю, как это можно устранить. Я упустил что-то совершенно очевидное? - person ; 19.05.2009