Можно ли вызвать код C ++ из C #? - PullRequest
81 голосов
/ 01 июня 2009

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

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

Ответы [ 7 ]

85 голосов
/ 01 июня 2009

Один простой способ вызвать 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();

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

7 голосов
/ 01 июня 2009

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

7 голосов
/ 01 июня 2009

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

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

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

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

http://www.pinvoke.net/

1 голос
/ 01 июня 2009

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

1 голос
/ 01 июня 2009

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

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

0 голосов
/ 25 ноября 2010

Рассматривали ли вы Apache Thrift?

http://thrift.apache.org/

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

...