如何解决pinvokestackimbalance异常或关闭它?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (157)

我刚刚从vs2008切换到vs2010。完全相同的解决方案,除了现在每调用一次C ++ dll都会产生一个'pinvokestackimbalance'异常。

这个异常在2008年没有被解雇。我可以完全访问C ++ dll和调用应用程序。看起来没有任何问题,但是这个问题使得调试其他问题变得不可能; IDE不断停下来告诉我这些事情。

例如,这里是C#签名:

    [DllImport("ImageOperations.dll")]
    static extern void FasterFunction(
        [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, //IntPtr inImage, 
        [MarshalAs(UnmanagedType.LPArray)]byte[] outImage, //IntPtr outImage, 
        int inTotalSize, int inWindow, int inLevel);

以下是C ++端的样子:

#ifdef OPERATIONS_EXPORTS
#define OPERATIONS_API __declspec(dllexport)
#else
#define OPERATIONS_API __declspec(dllimport)
#endif
extern "C" {


OPERATIONS_API void __cdecl FasterFunction(unsigned short* inArray, 
                                       unsigned char* outRemappedImage,
                                       int inTotalSize, 
                                       int inWindow, int inLevel);

}

vs2010和vs2008有什么不​​同,会导致这些异常被抛出?我应该为DllImport指令添加一组不同的参数吗?

提问于
用户回答回答于

“pInvokeStackImbalance”本身是一个托管调试助手。它在VS2008中默认关闭,但很多人没有打开它,所以它在VS2010中默认开启。MDA不会以发布模式运行,因此如果为发布版本构建,它将不会触发。

在你的情况下,调用约定是不正确的。DllImport默认为CallingConvention.WinApi,这与CallingConvention.StdCallx86桌面代码相同,应该是CallingConvention.Cdecl

这可以通过编辑该行[DllImport("ImageOperations.dll")]来完成:

[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)]
用户回答回答于

要关闭它:

  1. CTRL + ALT + E
  2. 在“Managed Debugging Assistants”下取消选中PInvokeStackImbalance。

扫码关注云+社区

领取腾讯云代金券