Maison > Article > développement back-end > Pourquoi est-ce que j'obtiens une exception « pinvokestackimbalance » dans Visual Studio 2010 ?
Exception PinvokeStackImbalance : compréhension et résolution dans Visual Studio 2010
Dans Visual Studio 2010, certains appels aux DLL C peuvent entraîner un "pinvokestackimbalance " exception. Cette exception a été désactivée par défaut dans Visual Studio 2008, mais est activée par défaut dans Visual Studio 2010.
Cause de l'exception
L'exception "pinvokestackimbalance" n'est pas en fait une exception mais un assistant de débogage géré (MDA). Il détecte les incohérences dans la convention d'appel entre le code managé et non managé lors de l'utilisation de l'appel de plateforme (P/Invoke).
Convention d'appel incorrecte
Dans l'exemple de code fourni, le Le code C# utilise l'attribut [DllImport] avec le CallingConvention.WinApi par défaut, qui est équivalent à CallingConvention.StdCall pour le code de bureau x86. Cependant, le code C utilise la convention d'appel __cdecl.
Résolution
Pour résoudre ce problème, l'attribut CallingConvention dans l'attribut [DllImport] doit être explicitement défini sur CallingConvention. .Cdecl pour correspondre à la convention d'appel utilisée dans le code C. Le code mis à jour ressemblerait à :
<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>
Remarque supplémentaire
Le MDA "pinvokestackimbalance" n'est actif qu'en mode débogage. En mode release, cela ne déclenchera pas l’exception. Par conséquent, si le problème se produit uniquement en mode débogage, la définition correcte de l’attribut CallingConvention devrait le résoudre.
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!