Czy można wywołać kod C ++ z C #?

86

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.

Peter Mortensen
źródło
Niezmienione c ++ do mangaged c #: c-sharpcorner.com/uploadfile/tanmayit08/…
Tyler S.

Odpowiedzi:

90

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.

Zaćmienie
źródło
2
link jest uszkodzony dla posta na blogu :(
Vidar
9

Nie znam wspomnianej biblioteki, ale ogólnie można to zrobić na kilka sposobów:

  • P / Wywołaj do wyeksportowanych funkcji bibliotecznych
  • Dodanie odwołania do biblioteki typów COM (w przypadku, gdy mamy do czynienia z obiektami COM).
Mehrdad Afshari
źródło
9

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

cokół
źródło
Mam problemy z wywołaniami zwrotnymi i p / invoke. Przejście na C ++ / CLI rozwiązało te problemy.
MedicineMan
5

Tak, nazywa się P / Invoke .

Oto świetna witryna z zasobami dotyczącymi używania go z interfejsem API Win32:

http://www.pinvoke.net/

Dana Holt
źródło
2

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 .

Mat Nadrofsky
źródło
2

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.

Frank Schwieterman
źródło