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

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

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

Ответ 1

Один простой способ вызова в С++ - создать сборку оберток в С++/CLI. В С++/CLI вы можете вызвать неуправляемый код, как если бы вы писали собственный код, но вы можете вызвать код С++/CLI из С#, как если бы он был написан на С#. Язык был в основном разработан с interop в существующие библиотеки как "приложение-убийца".

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

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

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

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

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

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

Откроем этот пост в блоге для более объясненного примера.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

http://www.pinvoke.net/

Ответ 5

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

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

Ответ 6

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

Ответ 7

Вы считали Apache Thrift?

http://thrift.apache.org/

Похоже, это очень четкое решение.