来自HDFDotNet 1.8.7的“检测到PInvokeStackImbalance”

时间:2011-05-26 22:20:00

标签: c# pinvoke hdf5

我一直在尝试更新到最新的HDF5DotNet包装器(1.8.7)并收到以下警告(从VS2010以DEBUG模式运行时):

检测到PInvokeStackImbalance 消息:对PInvoke函数'HDF5DotNet!:: H5Fopen'的调用使堆栈失衡。 这很可能是因为托管PInvoke签名与非托管目标签名不匹配。 检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。

我正在使用预编译的二进制文件(用于.NET Framework 4.0 32位的HDF5DotNet程序集),但是当我从源代码编译时得到了相同的结果。

奇怪的是,当我在非DEBUG模式下执行调用HDF5DotNet包装器的应用程序时,我发现没有问题。我注意到在1.8.6和1.8.7之间,所有调用约定都从Cdecl切换到StdCall。这会导致这个吗?我见过其他论坛说CallingConvention应该是Cdecl ......

谢谢!

1 个答案:

答案 0 :(得分:2)

是的,将stdcall函数调用为cdecl或反过来会导致堆栈不平衡。这些约定之间的主要区别在于,使用cdecl 调用者负责从堆栈中删除参数,使用stdcall callee 负责。

我想在发布模式下你有同样的错误。但是您没有收到错误,因为某些运行时检查已禁用。在大多数使用错误调用约定的情况下,本机程序会崩溃,但似乎.net互操作代码具有更强大的堆栈处理能够掩盖此问题。