c#使用dllimport调用c++生成的dll库文件报错
报错信息为
对 PInvoke 函数xxx的调用导致堆栈不对称原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
解决方法
点击C++项目属性来到配置属性下面的C/C++点击高级在右边的调用约定里选择 __stdcall (/Gz)
以下是产生上述问题的原因(_stdcall与_cdecl两者之间的区别)
WINDOWS的函数调用时需要用到栈(STACK一种先入后出的存储结构)当函数调用完成后栈需要清除这里就是问题的关键如何清除??
如果我们的函数使用了_cdecl那么栈的清除工作是由调用者用COM的术语来讲就是客户来完成的这样带来了一个棘手的问题不同的编译器产生栈的方式不尽相同那么调用者能否正常的完成清除工作呢?答案是不能
如果使用__stdcall上面的问题就解决了函数自己解决清除工作所以在跨(开发)平台的调用中我们都使用__stdcall(虽然有时是以WINAPI的样子出现)