修复 VS2010 中的 PinvokeStackImbalance 异常
之前在 VS2008 中默认禁用的 PinvokeStackImbalance 异常在 VS2010 中已默认启用。此异常旨在提醒开发人员 DllImport 调用中的调用约定不正确。
问题定义
将解决方案从 VS2008 迁移到 VS2010 时,DllImport 调用 C DLL始终抛出 PinvokeStackImbalance 异常,即使 DLL 本身没有更改。
解决方案
问题源于 DllImport 声明中使用的不正确的调用约定。默认情况下,DllImport 使用 CallingConvention.WinApi,这相当于 x86 桌面代码的 CallingConvention.StdCall。但是,底层 C 函数声明为 __cdecl,需要 CallingConvention.Cdecl。
修复
修改 DllImport 声明以显式指定正确的调用约定:
<code class="csharp">[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)] static extern void FasterFunction( [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, //IntPtr inImage, [MarshalAs(UnmanagedType.LPArray)]byte[] outImage, //IntPtr outImage, int inTotalSize, int inWindow, int inLevel);</code>
附加说明
以上是如何修复VS2010中的PinvokeStackImbalance异常?的详细内容。更多信息请关注PHP中文网其他相关文章!