Maison  >  Article  >  développement back-end  >  Comment corriger l'exception PinvokeStackImbalance dans VS2010 ?

Comment corriger l'exception PinvokeStackImbalance dans VS2010 ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-03 21:17:29781parcourir

How to Fix the PinvokeStackImbalance Exception in VS2010?

Correction de l'exception PinvokeStackImbalance dans VS2010

L'exception PinvokeStackImbalance, précédemment désactivée par défaut dans VS2008, a été activée par défaut dans VS2010. Cette exception est destinée à alerter les développeurs des conventions d'appel incorrectes dans les appels DllImport.

Définition du problème

Lors de la migration d'une solution de VS2008 vers VS2010, DllImport appelle vers une DLL C lève systématiquement l'exception PinvokeStackImbalance, même si la DLL elle-même n'a pas changé.

Résolution

Le problème provient d'une convention d'appel incorrecte utilisée dans la déclaration DllImport. Par défaut, DllImport utilise CallingConvention.WinApi, qui équivaut à CallingConvention.StdCall pour le code de bureau x86. Cependant, la fonction C sous-jacente est déclarée comme __cdecl, ce qui nécessite CallingConvention.Cdecl.

Fix

Modifiez la déclaration DllImport pour spécifier explicitement la convention d'appel correcte :

<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>

Notes supplémentaires

  • Cette exception se produit uniquement en mode assistant de débogage géré (MDA). Il ne se déclenchera pas en mode Release.
  • Pour plus d'informations sur les conventions d'appel, consultez la référence MSDN.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn