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.
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.
Jawaban:
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.
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 tidak begitu paham dengan perpustakaan yang Anda sebutkan, tetapi secara umum ada beberapa cara untuk melakukannya:
Ya, ini disebut P / Invoke .
Berikut adalah situs sumber daya yang bagus untuk menggunakannya dengan Win32 API:
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 .
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.
Sudahkah Anda mempertimbangkan Apache Thrift?
Sepertinya solusi yang sangat rapi.