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