日期:2014-05-17  浏览次数:20998 次

net2.0升级到net4.0后,出现PInvoke错误
将原来2.0的程序升到4.0后,出现如下的错误,找了半天也没找出原因来,C++的代码也对着找了,上网试了很多种方法还是一个结果,但原来2.0的就没问题,郁闷,盼高手指点,解决即散分,谢谢……

对 PInvoke 函数“****”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

------解决方案--------------------
看原型,以及调用约定是否一致
------解决方案--------------------
[DllImport("xxx", CallingConvention=CallingConvention.Cdecl)]
注意红色部分,默认情况下是StdCall,而不是Cdecl,而C++的代码默认情况下属于Cdecl,只有添加CALLBACK(__stdcall的别名)前缀的才属于StdCall,这在以前的版本里可以不需要区分,但是到了4.0就变得严格了,不区分就报错。
------解决方案--------------------
1.如果在没有方法参数的情况下,C#(4.0和3.5都可以)可以调用C++ DLL文件中的方法

2.如果有方法参数(x,y),那么C#只能在FrameWorkElement3.5框架下调用C++的DLL文件,在4.0中调用会报错,错误信息如下

设置 CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl
C# code
[DllImport("kernel32", CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]