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


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.


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

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


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


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 .


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.