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) { // ... }
Dalam C#, kita boleh mengisytiharkan fungsi interop sebagai berikut:
[DllImport("...")] static extern void foo(string str); // ... foo("bar");
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 }
Dan dalam C#:
[DllImport("...")] static extern void foo(StringBuilder str, int len); // ... StringBuilder sb = new StringBuilder(10); foo(sb, sb.Capacity);
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!