Можно ли вызвать код C ++ из C #?

Можно ли вызвать код C ++, возможно, скомпилированный как файл библиотеки кода (.dll), из языка .NET, такого как C #?

В частности, код C ++, такой как сетевая библиотека RakNet.


person Community    schedule 01.06.2009    source источник
comment
Непривязанный C ++ к управляемому C #: c-sharpcorner.com/uploadfile/tanmayit08/   -  person Tyler S. Loeper    schedule 26.02.2019


Ответы (7)


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

Например - скомпилируйте это с переключателем / clr

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

public:
     ManagedType() : NativePtr(new NativeType()) {}
     ~ManagedType() { delete NativePtr; }

     void ManagedMethod()
      { NativePtr->NativeMethod(); } 
}; 

Затем в C # добавьте ссылку на сборку ManagedType и используйте ее так:

ManagedType mt = new ManagedType();
mt.ManagedMethod();

Ознакомьтесь с это сообщение в блоге, чтобы получить более объясненный пример.

person Eclipse    schedule 01.06.2009
comment
ссылка для сообщения в блоге не работает :( - person Vidar; 03.12.2018

P / Invoke - отличная технология, и она работает довольно хорошо, за исключением проблем с загрузкой целевого файла DLL. Мы обнаружили, что лучший способ сделать это - создать статическую библиотеку собственных функций и связать ее с проектом Managed C ++ (или C ++ / CLI), который от нее зависит.

person plinth    schedule 01.06.2009
comment
У меня были проблемы с обратными вызовами и p / invoke. Переход на C ++ / CLI решил эти проблемы. - person MedicineMan; 01.06.2009

Я не знаком с упомянутой вами библиотекой, но в целом есть несколько способов сделать это:

  • P / Invoke для экспортированных библиотечных функций
  • Добавление ссылки на библиотеку типов COM (если вы имеете дело с COM-объектами).
person mmx    schedule 01.06.2009

Да, это называется P / Invoke.

Вот отличный ресурс для использования с Win32 API:

http://www.pinvoke.net/

person TWA    schedule 01.06.2009

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

Мы делаем это с C # на наших устройствах Windows Mobile с помощью P / Invoke. .

person Mat Nadrofsky    schedule 01.06.2009

Используемая для этого технология называется P / Invoke; вы можете искать статьи по этой теме. Обратите внимание, что это для вызова C из C #, а не для C ++. Поэтому вам нужно обернуть свой код C ++ в оболочку C, которую экспортирует ваша DLL.

person Frank Schwieterman    schedule 01.06.2009

Вы думали об Apache Thrift?

http://thrift.apache.org/

Похоже, очень-очень изящное решение.

person Soumendra    schedule 25.11.2010