Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erhalte ich „PinvokeStackImbalance“-Fehler in Visual Studio 2010, wenn ich eine C-DLL aus C# aufrufe?

Warum erhalte ich „PinvokeStackImbalance“-Fehler in Visual Studio 2010, wenn ich eine C-DLL aus C# aufrufe?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-02 21:42:30581Durchsuche

Why Do I Get

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:

  1. 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>
  2. 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.

    • Öffnen Sie die Tools von Visual Studio > Optionsmenü.
    • Navigieren Sie zu Debuggen > Allgemein.
    • Deaktivieren Sie die Option „Verwaltete Debugging-Assistenten aktivieren“.

Zusätzliche Überlegungen:

  • Der PinvokeStackImbalance MDA ist im Release-Modus standardmäßig nicht aktiviert, sodass das Problem beim Erstellen für die Release nicht auftritt.
  • Weitere Informationen finden Sie in der MSDN-Dokumentation zur CallingConvention-Enumeration (https://docs.microsoft.com). .com/en-us/dotnet/framework/unmanaged-api/calling-conventions-for-platform-invoke#the-callingconvention-enumeration).

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!

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