Heim > Artikel > Backend-Entwicklung > Warum erhalte ich „PinvokeStackImbalance“-Fehler in Visual Studio 2010, wenn ich eine C-DLL aus C# aufrufe?
PinvokeStackImbalance-Fehler in Visual Studio 2010
Frage:
Beim Upgrade auf Visual Studio 2010 stoßen Benutzer auf eine dauerhafte „pinvokestackimbalance“-Ausnahme, wenn sie eine C-DLL aus einer C#-Anwendung aufrufen. Diese Ausnahme war in Visual Studio 2008 nicht vorhanden.
Antwort:
Diese Ausnahme entsteht aufgrund einer Änderung im Standardverhalten des Managed Debugging Assistant (MDA) in Visual Studio 2010. Um dieses Problem zu beheben, beachten Sie die folgenden Schritte:
Korrigieren Sie die Aufrufkonvention:
Die Hauptursache der Ausnahme ist eine falsche Einstellung der Aufrufkonvention. In Visual Studio 2010 ist die Standardaufrufkonvention für DllImport CallingConvention.WinApi, was CallingConvention.StdCall für x86-Desktopanwendungen entspricht. Allerdings erwartet die C-DLL in diesem Fall die Cdecl-Aufrufkonvention.
Um dies zu korrigieren, bearbeiten Sie das [DllImport]-Attribut im C#-Code, um CallingConvention.Cdecl explizit anzugeben.
<code class="cs">[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>
Deaktivieren Sie den PinvokeStackImbalance-MDA:
Der PinvokeStackImbalance-MDA kann in den Debugging-Einstellungen von Visual Studio deaktiviert werden, um zu verhindern, dass er andere Debugging-Aufgaben beeinträchtigt.
Zusätzliche Überlegungen:
Das obige ist der detaillierte Inhalt vonWarum erhalte ich „PinvokeStackImbalance“-Fehler in Visual Studio 2010, wenn ich eine C-DLL aus C# aufrufe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!