我一直在尝试更新到最新的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 ......
谢谢!
答案 0 :(得分:2)
是的,将stdcall
函数调用为cdecl
或反过来会导致堆栈不平衡。这些约定之间的主要区别在于,使用cdecl
调用者负责从堆栈中删除参数,使用stdcall callee 负责。
我想在发布模式下你有同样的错误。但是您没有收到错误,因为某些运行时检查已禁用。在大多数使用错误调用约定的情况下,本机程序会崩溃,但似乎.net互操作代码具有更强大的堆栈处理能够掩盖此问题。