Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Melepasi Rentetan Antara C# dan C DLL dengan lancar?

Bagaimanakah Saya Boleh Melepasi Rentetan Antara C# dan C DLL dengan lancar?

DDD
Lepaskan: 2025-01-05 03:53:39
asal
1006 orang telah melayarinya

How Can I Seamlessly Pass Strings Between C# and a C   DLL?

Antaramuka Rentetan antara C# dan C DLL

Mengenkapsulasi manipulasi rentetan dalam C DLL dan memanggilnya daripada C# nampaknya mudah; walau bagaimanapun, melepasi rentetan merentasi sempadan kebolehoperasian memberikan cabaran. Artikel ini meneroka kerumitan yang terlibat dalam pertukaran tersebut dan menyediakan penyelesaian untuk pemindahan rentetan yang lancar.

The Pitfall

Melalui rentetan perpustakaan standard C secara langsung (std::string) merentasi sempadan C#/.NET tidak serasi. Ini kerana C# tidak menyediakan rakan sejawat untuk std::string. Akibatnya, percubaan untuk melaksanakan kebolehoperasian gagal dengan Sistem.AccessViolationException.

Penyelesaian: Rentetan Saling Kendalian

Untuk mengatasi halangan ini, kita mesti menggunakan jenis rentetan saling kendali di sempadan. Satu pilihan sedemikian ialah tatasusunan aksara yang ditamatkan nol, yang boleh dikendalikan dengan mudah dalam kedua-dua C dan C#. Pendekatan ini memerlukan memperuntukkan dan mengagihkan memori dalam modul yang sama.

Meluluskan Rentetan daripada C# ke C

Pertimbangkan fungsi C berikut yang menerima tatasusunan aksara yang ditamatkan nol:

void foo(const char *str) {
  // ...
}
Salin selepas log masuk

Dalam C#, kita boleh mengisytiharkan fungsi interop sebagai berikut:

[DllImport("...")]
static extern void foo(string str);

// ...

foo("bar");
Salin selepas log masuk

Dalam senario ini, pengkompil C# secara automatik menyusun rentetan terurus ("bar") ke dalam tatasusunan aksara yang ditamatkan nol, yang dihantar ke fungsi C.

Melalui Rentetan daripada C ke C#

Sebaliknya, fungsi C boleh menulis rentetan ke dalam penimbal yang diperuntukkan oleh pemanggil C#:

void foo(char *str, int len) {
  // Perform operations within len characters of str
}
Salin selepas log masuk

Dan dalam C#:

[DllImport("...")]
static extern void foo(StringBuilder str, int len);

// ...

StringBuilder sb = new StringBuilder(10);
foo(sb, sb.Capacity);
Salin selepas log masuk

Di sini, C# memperuntukkan objek StringBuilder dan mendedahkan penimbal dalamannya kepada fungsi C melalui StringBuilder dan Parameter kapasiti. Fungsi C kemudiannya boleh mengisi penimbal dengan sehingga aksara Kapasiti.

Kesimpulan

Dengan mengguna pakai jenis rentetan saling kendali, rentetan boleh dihantar dengan lancar antara C# dan C DLL, menyediakan mekanisme yang mudah untuk bertukar-tukar data teks merentas bahasa dan platform yang berbeza.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melepasi Rentetan Antara C# dan C DLL dengan lancar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan