首页  >  文章  >  后端开发  >  如何修复VS2010中的PinvokeStackImbalance异常?

如何修复VS2010中的PinvokeStackImbalance异常?

Barbara Streisand
Barbara Streisand原创
2024-11-03 21:17:29781浏览

How to Fix the PinvokeStackImbalance Exception in VS2010?

修复 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>

附加说明

  • 此异常仅发生在托管调试助手(MDA)模式下。它不会在发布模式下触发。
  • 有关调用约定的更多信息,请参阅 MSDN 参考。

以上是如何修复VS2010中的PinvokeStackImbalance异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

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