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


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

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

7 79

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, используя P / Invoke.

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

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

http://thrift.apache.org/

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