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

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

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

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();

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


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

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

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


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

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

http://www.pinvoke.net/


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

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


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


вы рассматривали Apache бережливость?

http://thrift.apache.org/

Это кажется очень очень аккуратным решением.