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


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.


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).

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.


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



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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.