Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Meluluskan Rentetan Antara C# dan C DLL?

Bagaimana untuk Meluluskan Rentetan Antara C# dan C DLL?

Susan Sarandon
Lepaskan: 2025-01-03 19:35:41
asal
310 orang telah melayarinya

How to Seamlessly Pass Strings Between C# and C   DLLs?

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;
    }
}
Salin selepas log masuk

Dalam C#, fungsi dipanggil menggunakan interop:

[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern string concat(string a, string b);
Salin selepas log masuk

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
}
Salin selepas log masuk

Dan dalam C#:

[DllImport("...", CallingConvention = CallingConvention.Cdecl)
static extern void foo(string str);
Salin selepas log masuk

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
}
Salin selepas log masuk

Dalam C#:

[DllImport("...", CallingConvention = CallingConvention.Cdecl)
static extern void foo(StringBuilder str, int len);
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan