Memahami C# P/Invoke Memanggil konflik konvensyen: CDECL vs Stdcall
Platform Invoke (P/INVOKE) Jambatan Terurus (C#) dan Kod yang tidak dikendalikan (mis., C). Walau bagaimanapun, percanggahan dalam memanggil konvensyen boleh menyebabkan masalah interoperabiliti.
Sumber masalah
konflik berpunca daripada pengendalian konvensyen panggilan yang berbeza antara c dan tetapan p/invoke lalai di C#.
__stdcall
callee
CallingConvention.Winapi
__stdcall
perbezaan teras terletak di: Kata kunci konvensyen:
dalam c versus(atau
) dalam c#.__stdcall
(sering digunakan dalam c) memerlukan fungsi panggilan (CallingConvention.Winapi
memberikan ini kepada CallingConvention.Stdcall
. __cdecl
caller
__stdcall
callee
Contoh pengisytiharan P/Invoke yang salah: pengisytiharan C# yang betul:
Untuk memastikan keserasian, atribut C# CallingConvention.Cdecl
mesti sepadan dengan konvensyen fungsi C: __stdcall
Mencegah ketidakpadanan konvensyen:
Sentiasa sahkan konvensyen panggilan fungsi yang tidak diurus dan cerminnya tepat dalam deklarasi C# DllImport
anda. Rujuk dokumentasi Microsoft untuk maklumat terperinci mengenai konvensyen panggilan yang disokong.
Atas ialah kandungan terperinci Kenapa CDECL dan StdCall memanggil konvensyen tidak sepadan dalam C# p/invoke, dan bagaimanakah ini dapat diperbaiki?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!