PinvokeStackImbalance-Problem in Visual Studio 2010
In Visual Studio 2010 tritt beim Aufrufen von C-DLLs häufig eine „pinvokestackimbalance“-Ausnahme auf. Diese Ausnahme, die zuvor in Visual Studio 2008 deaktiviert war, ist jetzt in VS2010 standardmäßig aktiviert, was Debugging-Bemühungen behindert.
Ursache des Problems
Der Code:
<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>
Das Problem liegt in einer falschen Aufrufkonvention. DllImport ist standardmäßig CallingConvention.WinApi, identisch mit CallingConvention.StdCall für x86-Desktopcode. Die C-Funktion verwendet jedoch die __cdecl-Aufrufkonvention, die anders ist.
Lösung
Um das Problem zu beheben, kann man die DllImport-Zeile wie folgt bearbeiten:
<code class="csharp">[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)]</code>
Dadurch wird sichergestellt, dass die richtige Aufrufkonvention verwendet wird, wodurch die Ausnahme „pinvokestackimbalance“ behoben wird.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich in Visual Studio 2010 die Ausnahme „PinvokeStackImbalance'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!