Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyelesaikan System.AccessViolationException Apabila Melepasi Rentetan Antara C# dan C DLL?
String Interoperability Challenge dalam C# dan C DLL
Melalui rentetan dengan lancar antara C# dan C DLL telah terbukti menjadi batu penghalang bagi ramai orang. Mari kita mendalami selok-belok isu ini dan menyediakan penyelesaian yang menghapuskan Sistem yang berterusan.AccessViolationException.
Masalahnya
Inti masalah terletak pada ketidakupayaan untuk melepasi objek C std::string merentasi sempadan interop. Percubaan untuk berbuat demikian, seperti dalam kod C# yang diberikan, akan mengakibatkan pengecualian pelanggaran akses.
Penyelesaian: Menggunakan Jenis Mesra Interop
Untuk mengelakkan ralat ini , kita mesti menggunakan jenis data mesra interop di sempadan interop. Pilihan utama ialah tatasusunan aksara yang ditamatkan nol. Mereka cemerlang apabila peruntukan memori dan deallocation berlaku dalam modul yang sama, memudahkan data yang dihantar dari C# ke C .
C Code
void foo(const char *str) { // Perform some action on the string }
C# Code
[DllImport("...", CallingConvention = CallingConvention.Cdecl)] static extern void foo(string str); // ... foo("bar");
Mengirim Data dari C ke C#
Dalam kes di mana penerima memerlukan memperuntukkan penimbal, pendekatan berikut disyorkan:
Kod C
void foo(char *str, int len) { // Write up to len characters into str }
Kod C#
[DllImport("...", CallingConvention = CallingConvention.Cdecl)] static extern void foo(StringBuilder str, int len); // ... StringBuilder sb = new StringBuilder(10); foo(sb, sb.Capacity);
Dengan menerima jenis data mesra interop, kami boleh mengatasi halangan pertukaran rentetan dengan berkesan antara C# dan C DLL, membuka jalan untuk komunikasi yang lancar dan aliran data tanpa ralat.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan System.AccessViolationException Apabila Melepasi Rentetan Antara C# dan C DLL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!