Ist es möglich, C ++ - Code, der möglicherweise als Codebibliotheksdatei (.dll) kompiliert wurde, aus einer .NET-Sprache wie C # heraus aufzurufen?
Insbesondere C ++ - Code wie die RakNet-Netzwerkbibliothek.
Ist es möglich, C ++ - Code, der möglicherweise als Codebibliotheksdatei (.dll) kompiliert wurde, aus einer .NET-Sprache wie C # heraus aufzurufen?
Insbesondere C ++ - Code wie die RakNet-Netzwerkbibliothek.
Antworten:
Eine einfache Möglichkeit, C ++ aufzurufen, besteht darin, eine Wrapper-Assembly in C ++ / CLI zu erstellen. In C ++ / CLI können Sie nicht verwalteten Code aufrufen, als ob Sie nativen Code schreiben würden, aber Sie können C ++ / CLI-Code von C # aus aufrufen, als ob er in C # geschrieben wäre. Die Sprache wurde im Wesentlichen mit Interop in vorhandene Bibliotheken als "Killer-App" entwickelt.
Zum Beispiel - kompilieren Sie dies mit dem Schalter / clr
#include "NativeType.h"
public ref class ManagedType
{
NativeType* NativePtr;
public:
ManagedType() : NativePtr(new NativeType()) {}
~ManagedType() { delete NativePtr; }
void ManagedMethod()
{ NativePtr->NativeMethod(); }
};
Fügen Sie dann in C # einen Verweis auf Ihre ManagedType-Assembly hinzu und verwenden Sie ihn wie folgt:
ManagedType mt = new ManagedType();
mt.ManagedMethod();
In diesem Blogbeitrag finden Sie ein ausführlicheres Beispiel.
Ich bin mit der von Ihnen erwähnten Bibliothek nicht vertraut, aber im Allgemeinen gibt es mehrere Möglichkeiten, dies zu tun:
P / Invoke ist eine nette Technologie und funktioniert ziemlich gut, mit Ausnahme von Problemen beim Laden der Ziel-DLL-Datei. Wir haben festgestellt, dass der beste Weg, dies zu tun, darin besteht, eine statische Bibliothek nativer Funktionen zu erstellen und diese mit einem davon abhängigen verwalteten C ++ - (oder C ++ / CLI-) Projekt zu verknüpfen.
Ja, es heißt P / Invoke .
Hier ist eine großartige Ressourcenseite für die Verwendung mit der Win32-API:
Sicher ist. Dieser Artikel ist ein gutes Beispiel für etwas, das Sie tun können, um damit zu beginnen.
Wir tun dies von C # auf unseren Windows Mobile-Geräten mit P / Invoke .
Die dafür verwendete Technologie heißt P / Invoke . Sie können nach Artikeln zu diesem Thema suchen. Beachten Sie, dass C für den Aufruf von C # und nicht für C ++ verwendet wird. Sie müssen Ihren C ++ - Code also in einen C-Wrapper einschließen, den Ihre DLL exportiert.
Haben Sie über Apache Thrift nachgedacht?
Es scheint eine sehr sehr saubere Lösung zu sein.