Heim > Artikel > Backend-Entwicklung > Warum erhalte ich in Visual Studio 2010 die Ausnahme „pinvokestackimbalance“?
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!