";PInvokeStackImbalance被检测到”;来自HDFDotNet 1.8.7

本文关键字:HDFDotNet 来自 quot PInvokeStackImbalance 检测 | 更新日期: 2023-09-27 17:57:42

我一直在尝试更新到最新的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。。。

谢谢!

";PInvokeStackImbalance被检测到”;来自HDFDotNet 1.8.7

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

我想在发布模式下你也有同样的错误。但是您不会得到错误,因为某些运行时检查被禁用。在使用错误的调用约定的大多数情况下,本机程序都会崩溃,但.net互操作代码似乎有一个更健壮的堆栈处理来掩盖这个问题。