Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erhalte ich in Visual Studio 2010 die Ausnahme „PinvokeStackImbalance“?

Warum erhalte ich in Visual Studio 2010 die Ausnahme „PinvokeStackImbalance“?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 22:43:30220Durchsuche

Why Am I Getting a

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn