首页  >  文章  >  后端开发  >  为什么从 C# 调用 C DLL 时在 Visual Studio 2010 中出现“PinvokeStackImbalance”错误?

为什么从 C# 调用 C DLL 时在 Visual Studio 2010 中出现“PinvokeStackImbalance”错误?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-02 21:42:30583浏览

Why Do I Get

Visual Studio 2010 中出现 PinvokeStackImbalance 错误

问题:

升级到 Visual Studio 2010 后,用户在从 C# 应用程序调用 C DLL 时遇到持续的“pinvokestackimbalance”异常。 Visual Studio 2008 中不存在此异常。

答案:

此异常是由于托管调试助手 (MDA) 的默认行为发生更改而导致的Visual Studio 2010。要解决此问题,请考虑以下步骤:

  1. 更正调用约定:

    异常的主要原因是调用约定设置不正确。在 Visual Studio 2010 中,DllImport 的默认调用约定是 CallingConvention.WinApi,这相当于 x86 桌面应用程序的 CallingConvention.StdCall。但是,本例中的 C DLL 需要 Cdecl 调用约定。

    要更正此问题,请编辑 C# 代码中的 [DllImport] 属性以显式指定 CallingConvention.Cdecl。

    <code class="cs">[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>
  2. 禁用 PinvokeStackImbalance MDA:

    可以在 Visual Studio 的调试设置中禁用 PinvokeStackImbalance MDA,以防止其干扰其他调试任务。

    • 打开 Visual Studio 的工具>;选项菜单。
    • 导航至“调试”>一般。
    • 取消选中“启用托管调试助手”选项。

其他注意事项:

  • PinvokeStackImbalance MDA 在发布模式下默认未启用,因此构建发布时不会出现此问题。
  • 有关更多信息,请参阅有关 CallingConvention 枚举的 MSDN 文档 (https://docs.microsoft .com/en-us/dotnet/framework/unmanaged-api/calling-conventions-for-platform-invoke#the-callingconvention-enumeration)。

以上是为什么从 C# 调用 C DLL 时在 Visual Studio 2010 中出现“PinvokeStackImbalance”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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