Heim  >  Artikel  >  Backend-Entwicklung  >  Wie behebe ich die PinvokeStackImbalance-Ausnahme in VS2010?

Wie behebe ich die PinvokeStackImbalance-Ausnahme in VS2010?

Barbara Streisand
Barbara StreisandOriginal
2024-11-03 21:17:29781Durchsuche

How to Fix the PinvokeStackImbalance Exception in VS2010?

PinvokeStackImbalance-Ausnahme in VS2010 beheben

Die PinvokeStackImbalance-Ausnahme, die zuvor in VS2008 standardmäßig deaktiviert war, wurde in VS2010 standardmäßig aktiviert. Diese Ausnahme soll Entwickler auf falsche Aufrufkonventionen in DllImport-Aufrufen aufmerksam machen.

Problemdefinition

Bei der Migration einer Lösung von VS2008 nach VS2010 ruft DllImport eine C-DLL auf Löst ständig die PinvokeStackImbalance-Ausnahme aus, auch wenn sich die DLL selbst nicht geändert hat.

Lösung

Das Problem ist auf eine falsche Aufrufkonvention zurückzuführen, die in der DllImport-Deklaration verwendet wird. Standardmäßig verwendet DllImport CallingConvention.WinApi, was CallingConvention.StdCall für x86-Desktopcode entspricht. Die zugrunde liegende C-Funktion ist jedoch als __cdecl deklariert, was CallingConvention.Cdecl erfordert.

Fix

Ändern Sie die DllImport-Deklaration, um explizit die richtige Aufrufkonvention anzugeben:

<code class="csharp">[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void FasterFunction(
    [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, //IntPtr inImage, 
    [MarshalAs(UnmanagedType.LPArray)]byte[] outImage, //IntPtr outImage, 
    int inTotalSize, int inWindow, int inLevel);</code>

Zusätzliche Hinweise

  • Diese Ausnahme tritt nur im Managed Debugging Assistant (MDA)-Modus auf. Im Release-Modus wird es nicht ausgelöst.
  • Weitere Informationen zu Aufrufkonventionen finden Sie in der MSDN-Referenz.

Das obige ist der detaillierte Inhalt vonWie behebe ich die PinvokeStackImbalance-Ausnahme in VS2010?. 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