Melalui Rentetan daripada C# ke C DLL dan Kembali
Apabila cuba menghantar rentetan antara C# dan C , pembangun sering menghadapi kesukaran. Dalam artikel ini, kami menyelidiki isu ini dan menyediakan penyelesaian ringkas.
Masalahnya
Pertimbangkan kod berikut, di mana C mentakrifkan fungsi untuk menggabungkan rentetan:
extern "C" { string concat(string a, string b){ return a + b; } }
Dalam C#, fungsi dipanggil menggunakan interop:
[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)] static extern string concat(string a, string b);
Walau bagaimanapun, pendekatan ini menghasilkan System.AccessViolationException.
Penyelesaian
Masalahnya terletak pada ketidakserasian C std::string dengan sempadan kebolehoperasian. Untuk menyelesaikan isu ini, jenis mesra interop mesti digunakan di sempadan, seperti tatasusunan aksara yang ditamatkan nol.
Melalukan Rentetan daripada C# ke C
Untuk rentetan yang diluluskan dari C# ke C , fungsi C boleh diubah suai:
void foo(const char *str) { // do something with str }
Dan dalam C#:
[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(string str);
Melalui Rentetan dari C ke C#
Untuk rentetan yang dihantar dari C ke C#, fungsi C menjadi:
void foo(char *str, int len) { // write no more than len characters into str }
Dalam C#:
[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(StringBuilder str, int len);
Dengan mematuhi garis panduan ini, pembangun boleh lulus rentetan dengan lancar antara C# dan C DLL.
Atas ialah kandungan terperinci Bagaimana untuk Meluluskan Rentetan Antara C# dan C DLL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!