Mungkin untuk memanggil kode C ++ dari C #?

86

Apakah mungkin untuk memanggil kode C ++, mungkin dikompilasi sebagai file pustaka kode (.dll), dari dalam bahasa .NET seperti C #?

Secara khusus, kode C ++ seperti pustaka jaringan RakNet.

Peter Mortensen
sumber
Tidak diubah c ++ menjadi mangaged c #: c-sharpcorner.com/uploadfile/tanmayit08/…
Tyler S. Loeper

Jawaban:

90

Salah satu cara mudah untuk memanggil ke C ++ adalah dengan membuat perakitan pembungkus di C ++ / CLI. Dalam C ++ / CLI Anda dapat memanggil kode yang tidak dikelola seolah-olah Anda sedang menulis kode asli, tetapi Anda dapat memanggil kode C ++ / CLI dari C # seolah-olah itu ditulis dalam C #. Bahasa ini pada dasarnya dirancang dengan interop ke perpustakaan yang ada sebagai "aplikasi pembunuh" -nya.

Misalnya - kompilasi ini dengan sakelar / clr

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

public:
     ManagedType() : NativePtr(new NativeType()) {}
     ~ManagedType() { delete NativePtr; }

     void ManagedMethod()
      { NativePtr->NativeMethod(); } 
}; 

Kemudian di C #, tambahkan referensi ke perakitan ManagedType Anda, dan gunakan seperti ini:

ManagedType mt = new ManagedType();
mt.ManagedMethod();

Lihat posting blog ini untuk contoh yang lebih dijelaskan.

Gerhana
sumber
2
tautan rusak untuk entri blog :(
Vidar
10

P / Invoke adalah teknologi yang bagus, dan bekerja dengan cukup baik, kecuali untuk masalah dalam memuat file DLL target. Kami telah menemukan bahwa cara terbaik untuk melakukan sesuatu adalah dengan membuat pustaka statis dari fungsi asli dan menautkannya ke proyek Managed C ++ (atau C ++ / CLI) yang bergantung padanya.

alas tiang
sumber
Saya mengalami masalah dengan callback dan p / invoke. Beralih ke C ++ / CLI telah mengatasi masalah ini.
MedicineMan
9

Saya tidak begitu paham dengan perpustakaan yang Anda sebutkan, tetapi secara umum ada beberapa cara untuk melakukannya:

  • P / Panggil ke fungsi perpustakaan yang diekspor
  • Menambahkan referensi ke pustaka tipe COM (jika Anda berurusan dengan objek COM).
mmx
sumber
5

Ya, ini disebut P / Invoke .

Berikut adalah situs sumber daya yang bagus untuk menggunakannya dengan Win32 API:

http://www.pinvoke.net/

Dana Holt
sumber
2

Tentu. Artikel ini adalah contoh bagus tentang sesuatu yang dapat Anda lakukan untuk memulai ini.

Kami melakukan ini dari C # pada perangkat Windows Mobile kami menggunakan P / Invoke .

Mat Nadrofsky
sumber
2

Teknologi yang digunakan untuk melakukan ini disebut P / Invoke ; Anda dapat mencari artikel tentang subjek tersebut. Perhatikan bahwa ini untuk memanggil C dari C #, bukan C ++. Jadi, Anda harus membungkus kode C ++ Anda dalam pembungkus C yang diekspor DLL Anda.

Frank Schwieterman
sumber