Mungkin untuk memanggil kode C ++ dari C #?


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.


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.


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


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 .


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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.