之前封装c++dll时总是出现”对 P/Invoke 函数的调用导致堆栈不对称。原因可能是托管的 P/Invoke 签名与非托管的目标签名不匹配”的问题,后来发现原来c/c++使用的是cdecl方式调用,而c#默认使用的是stdcall的方式来调用非托管代码,所以我们在调用native c++ dll的时候需要加上CallingConvention=CallingConvention.Cdecl来指定调用的方式。
我们也可以在c/c++的函数声明上加上__stdcall这一编译器关键字来使编译器按照stdcall方式来编译dll
https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx
关于P/Invoke(1)
最新推荐文章于 2025-11-01 17:30:34 发布
本文详细介绍了在C#中调用C++ DLL时遇到的“堆栈不对称”错误,原因是托管与非托管代码之间的调用约定不匹配。通过使用CallingConvention参数指定Cdecl调用约定,可以解决此问题。同时,文章还展示了如何在C++函数声明中使用__stdcall关键字进行编译。
816

被折叠的 条评论
为什么被折叠?



