Можно ли вызывать код С++, возможно, скомпилированный как файл библиотеки кода (DLL), из .NET-языка, такого как С#?
В частности, код С++, такой как сетевая библиотека RakNet.
Можно ли вызывать код С++, возможно, скомпилированный как файл библиотеки кода (DLL), из .NET-языка, такого как С#?
В частности, код С++, такой как сетевая библиотека RakNet.
Один простой способ вызова в С++ - создать сборку оберток в С++/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();
Откроем этот пост в блоге для более объясненного примера.
Я не знаком с библиотекой, которую вы упомянули, но в целом есть несколько способов сделать это:
P/Invoke - хорошая технология, и она работает достаточно хорошо, за исключением проблем при загрузке целевого DLL файла. Мы обнаружили, что лучший способ сделать это - создать статическую библиотеку собственных функций и связать ее с управляемым проектом С++ (или С++/CLI), который зависит от него.
Да, он называется P/Invoke.
Здесь большой ресурсный сайт для использования с API Win32:
Конечно. Эта статья является хорошим примером того, что вы можете сделать, чтобы начать с этого.
Мы делаем это с С# на наших устройствах Windows Mobile, используя P/Invoke.
Технология, используемая для этого, называется P/Invoke; вы можете искать статьи по этому вопросу. Обратите внимание, что это для вызова C из С#, а не С++. Таким образом, вам нужно обернуть свой код на С++ в обертку C, которую экспортирует ваша DLL.
Вы считали Apache Thrift?
Похоже, это очень четкое решение.