首页  >  文章  >  后端开发  >  为什么我在 Visual Studio 2010 中收到“pinvokestackimbalance”异常?

为什么我在 Visual Studio 2010 中收到“pinvokestackimbalance”异常?

Susan Sarandon
Susan Sarandon原创
2024-11-03 18:37:30553浏览

Why do I get a

PinvokeStackImbalance 异常:Visual Studio 2010 中的理解和解决

在 Visual Studio 2010 中,对 C DLL 的某些调用可能会导致“pinvokestackimbalance” “ 例外。此异常在 Visual Studio 2008 中默认禁用,但在 Visual Studio 2010 中默认启用。

异常原因

“pinvokestackimbalance”异常不是实际上是一个例外,而是一个托管调试助手(MDA)。使用平台调用 (P/Invoke) 时,它会检测托管代码和非托管代码之间的调用约定不一致。

不正确的调用约定

在提供的代码示例中, C# 代码使用带有默认 CallingConvention.WinApi 的 [DllImport] 属性,这相当于 x86 桌面代码的 CallingConvention.StdCall。但是,C 代码使用 __cdecl 调用约定。

解决方案

要解决此问题,必须将 [DllImport] 属性中的 CallingConvention 属性显式设置为 CallingConvention .Cdecl 以匹配 C 代码中使用的调用约定。更新后的代码如下所示:

<code class="csharp">[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void FasterFunction(
    [MarshalAs(UnmanagedType.LPArray)] ushort[] inImage, 
    [MarshalAs(UnmanagedType.LPArray)] byte[] outImage, 
    int inTotalSize, int inWindow, int inLevel);</code>

附加说明

“pinvokestackimbalance”MDA 仅在调试模式下处于活动状态。在release模式下,不会触发异常。因此,如果问题仅发生在调试模式下,正确设置 CallingConvention 属性应该可以解决问题。

以上是为什么我在 Visual Studio 2010 中收到“pinvokestackimbalance”异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn