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中文网其他相关文章!