Rumah > pembangunan bahagian belakang > C++ > Mengapakah Panggilan C# P/Invoke Saya Dengan `CallingConvention.Cdecl` Gagal Apabila Memanggil Fungsi C `__stdcall`?

Mengapakah Panggilan C# P/Invoke Saya Dengan `CallingConvention.Cdecl` Gagal Apabila Memanggil Fungsi C `__stdcall`?

Patricia Arquette
Lepaskan: 2025-01-25 23:51:11
asal
478 orang telah melayarinya

Why Does My C# P/Invoke Call With `CallingConvention.Cdecl` Fail When Calling a C   `__stdcall` Function?

Penyelesaian Masalah C# P/Invoke Memanggil Konvensyen Konvensyen

Artikel ini menerangkan masalah biasa apabila menggunakan platform Invoke (p/invoke) untuk berinteraksi antara kod C# dan C. Kami akan memberi tumpuan kepada isu konvensyen panggilan yang tidak sesuai:

dalam C# versus CallingConvention.Cdecl dalam c. __stdcall

Konvensyen memanggil dijelaskan

Dalam persekitaran 32-bit, panggilan konvensyen menentukan parameter lulus, penyimpanan timbunan, dan pembersihan. Konvensyen utama termasuk:

  • : __stdcall Pemanggil menolak argumen; Callee membersihkan timbunan. Digunakan oleh Windows API dan com.
  • : __cdecl Pemanggil menolak argumen dan membersihkan timbunan. Standard untuk C.
  • : __fastcall Menggunakan daftar untuk beberapa argumen, berpotensi meningkatkan kelajuan tetapi mengurangkan keserasian.
  • : __thiscall Sama seperti , tetapi mengendalikan penunjuk "ini" dalam fungsi ahli C. __cdecl
  • : __clrcall Unsur mengimbangi konvensyen panggilan yang diuruskan dari orang lain, menghalang isu timbunan.

analisis contoh kod

Pertimbangkan fungsi C:

extern "C" int __stdcall InvokedFunction(int);
Salin selepas log masuk
dan rakan sejawatnya C# P/Invoke:

[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
private static extern int InvokedFunction(IntPtr intArg);
Salin selepas log masuk

Clash konvensyen

Masalahnya berpunca dari

dalam C# yang bertentangan dengan CallingConvention.Cdecl dalam c. Ini membawa kepada ketidakseimbangan. Walaupun __stdcall selalunya p/invoke lalai (kerana kelaziman API Windows), interfacing dengan kod __stdcall C memerlukan spesifikasi konvensyen yang jelas. __cdecl

Resolusi

Penyelesaiannya adalah mudah: menyelaraskan konvensyen C# dengan C One:

[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Stdcall)]
private static extern int InvokedFunction(int intArg); // Note: IntPtr changed to int
Salin selepas log masuk

Takeaway Key

Memahami konvensyen panggilan adalah penting untuk kebolehoperasian interoperabiliti silang bahasa yang berjaya. Konvensyen yang sepadan menghalang kesilapan stack dan memastikan integrasi C# dan C yang lancar.

Atas ialah kandungan terperinci Mengapakah Panggilan C# P/Invoke Saya Dengan `CallingConvention.Cdecl` Gagal Apabila Memanggil Fungsi C `__stdcall`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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