Visual Studio 2010 中的 PinvokeStackImbalance 問題
在 Visual Studio 2010 中,在調用 CLL 時經常遇到 DLLkLL”異常。此異常先前在 Visual Studio 2008 中停用,現在在 VS2010 中預設啟用,這阻礙了偵錯工作。
問題原因
程式碼:
<code class="csharp">[DllImport("ImageOperations.dll")] static extern void FasterFunction( [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, [MarshalAs(UnmanagedType.LPArray)]byte[] outImage, int inTotalSize, int inWindow, int inLevel);</code>
<code class="cpp">extern "C" { OPERATIONS_API void __cdecl FasterFunction(unsigned short* inArray, unsigned char* outRemappedImage, int inTotalSize, int inWindow, int inLevel); }</code>
問題在於不正確的呼叫約定。 DllImport 預設為 CallingConvention.WinApi,與 x86 桌面程式碼的 CallingConvention.StdCall 相同。但是,C 函數使用 __cdecl 呼叫約定,這是不同的。
解決方案
要解決此問題,可以如下編輯DllImport 行:
<code class="csharp">[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)]</code>
這可確保使用正確的呼叫約定,解決“pinvokestackimbalance”異常。
以上是為什麼我在 Visual Studio 2010 中遇到「PinvokeStackImbalance」異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!