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

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

Susan Sarandon
Susan SarandonOriginal
2024-11-03 18:37:30553Durchsuche

Why do I get a

PinvokeStackImbalance-Ausnahme: Verständnis und Lösung in Visual Studio 2010

In Visual Studio 2010 können bestimmte Aufrufe von C-DLLs zu einem „pinvokestackimbalance“ führen " Ausnahme. Diese Ausnahme war in Visual Studio 2008 standardmäßig deaktiviert, ist jedoch in Visual Studio 2010 standardmäßig aktiviert.

Ursache der Ausnahme

Die Ausnahme „pinvokestackimbalance“ ist nicht vorhanden Eigentlich eine Ausnahme, aber ein Managed Debugging Assistant (MDA). Es erkennt Inkonsistenzen in der Aufrufkonvention zwischen verwaltetem und nicht verwaltetem Code bei Verwendung von Plattformaufruf (P/Invoke).

Falsche Aufrufkonvention

Im bereitgestellten Codebeispiel wird die C#-Code verwendet das Attribut [DllImport] mit dem Standardwert CallingConvention.WinApi, der CallingConvention.StdCall für x86-Desktopcode entspricht. Der C-Code verwendet jedoch die __cdecl-Aufrufkonvention.

Lösung

Um dieses Problem zu beheben, muss das CallingConvention-Attribut im [DllImport]-Attribut explizit auf CallingConvention festgelegt werden .Cdecl, um der im C-Code verwendeten Aufrufkonvention zu entsprechen. Der aktualisierte Code würde wie folgt aussehen:

<code class="csharp">[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>

Zusätzlicher Hinweis

Der MDA „pinvokestackimbalance“ ist nur im Debug-Modus aktiv. Im Release-Modus wird die Ausnahme nicht ausgelöst. Wenn das Problem daher nur im Debug-Modus auftritt, sollte es durch die korrekte Einstellung des CallingConvention-Attributs behoben werden.

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