Czy można wywołać kod C ++, prawdopodobnie skompilowany jako plik biblioteki kodu (.dll), z poziomu języka .NET, takiego jak C #?
W szczególności kod C ++, taki jak biblioteka sieciowa RakNet.
Czy można wywołać kod C ++, prawdopodobnie skompilowany jako plik biblioteki kodu (.dll), z poziomu języka .NET, takiego jak C #?
W szczególności kod C ++, taki jak biblioteka sieciowa RakNet.
Odpowiedzi:
Jednym z łatwych sposobów wywołania C ++ jest utworzenie zestawu otoki w C ++ / CLI. W C ++ / CLI możesz wywoływać niezarządzany kod tak, jakbyś pisał kod natywny, ale możesz wywoływać kod C ++ / CLI z C # tak, jakby był napisany w C #. Język został zasadniczo zaprojektowany z interopem w istniejących bibliotekach jako jego „zabójcza aplikacja”.
Na przykład - skompiluj to za pomocą przełącznika / clr
#include "NativeType.h"
public ref class ManagedType
{
NativeType* NativePtr;
public:
ManagedType() : NativePtr(new NativeType()) {}
~ManagedType() { delete NativePtr; }
void ManagedMethod()
{ NativePtr->NativeMethod(); }
};
Następnie w C # dodaj odwołanie do zestawu ManagedType i użyj go w ten sposób:
ManagedType mt = new ManagedType();
mt.ManagedMethod();
Zapoznaj się z tym postem na blogu, aby uzyskać dokładniejszy przykład.
Nie znam wspomnianej biblioteki, ale ogólnie można to zrobić na kilka sposobów:
P / Invoke to fajna technologia i działa całkiem dobrze, z wyjątkiem problemów z ładowaniem docelowego pliku DLL. Odkryliśmy, że najlepszym sposobem na zrobienie tego jest utworzenie statycznej biblioteki funkcji natywnych i połączenie jej z zależnym od niej projektem Managed C ++ (lub C ++ / CLI).
Tak, nazywa się P / Invoke .
Oto świetna witryna z zasobami dotyczącymi używania go z interfejsem API Win32:
Jasne, że tak. Ten artykuł jest dobrym przykładem tego, co możesz zrobić, aby zacząć.
Robimy to z poziomu C # na naszych urządzeniach z systemem Windows Mobile przy użyciu funkcji P / Invoke .
Technologia używana do tego nazywa się P / Invoke ; możesz wyszukiwać artykuły na ten temat. Zauważ, że służy do wywoływania C z C #, a nie C ++ tak bardzo. Musisz więc opakować swój kod C ++ w opakowanie C, które eksportuje biblioteka DLL.
Czy rozważałeś Apache Thrift?
Wydaje się, że to bardzo zgrabne rozwiązanie.