Kann C ++ - Code von C # aufgerufen werden?

86

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.

Peter Mortensen
quelle
Unverändertes c ++ zu verwaltetem c #: c-sharpcorner.com/uploadfile/tanmayit08/…
Tyler S. Loeper

Antworten:

90

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.

Finsternis
quelle
2
Link ist für Blog-Beitrag unterbrochen :(
Vidar
9

Ich bin mit der von Ihnen erwähnten Bibliothek nicht vertraut, aber im Allgemeinen gibt es mehrere Möglichkeiten, dies zu tun:

  • P / Aufrufen exportierter Bibliotheksfunktionen
  • Hinzufügen eines Verweises auf die COM-Typbibliothek (falls Sie mit COM-Objekten arbeiten).
Mehrdad Afshari
quelle
9

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.

Sockel
quelle
Ich hatte Probleme mit Rückrufen und p / invoke. Durch die Umstellung auf C ++ / CLI wurden diese Probleme behoben.
MedicineMan
5

Ja, es heißt P / Invoke .

Hier ist eine großartige Ressourcenseite für die Verwendung mit der Win32-API:

http://www.pinvoke.net/

Dana Holt
quelle
2

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 .

Mat Nadrofsky
quelle
2

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.

Frank Schwieterman
quelle