首頁  >  文章  >  後端開發  >  為什麼從 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:30581瀏覽

Why Do I Get

Visual Studio 2010 中出現PinvokeStackImbalance 錯誤

問題:

問題:

問題:

    後,使用者在從C# 應用程式呼叫C DLL 時遇到持續的「pinvokestackimbalance」異常。 Visual Studio 2008 中不存在此異常。
  1. 答案:

    此異常是由於託管偵錯助理 (MDA) 的預設行為變更而導致的Visual Studio 2010。要解決此問題,請考慮以下步驟:

    <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. 修正呼叫約定:
  3. 異常的主要原因是呼叫約定設定不正確。在 Visual Studio 2010 中,DllImport 的預設呼叫約定是 CallingConvention.WinApi,這相當於 x86 桌面應用程式的 CallingConvention.StdCall。但是,本例中的 C DLL 需要 Cdecl 呼叫約定。

    若要修正此問題,請編輯 C# 程式碼中的 [DllImport] 屬性以明確指定 CallingConvention.Cdecl。

    • 禁用PinvokeStackImbalance MDA:
    • 可以在Visual Studio 的調試設定中禁用其乾擾。
開啟 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