Maison  >  Article  >  développement back-end  >  Pourquoi est-ce que j'obtiens une exception « pinvokestackimbalance » dans Visual Studio 2010 ?

Pourquoi est-ce que j'obtiens une exception « pinvokestackimbalance » dans Visual Studio 2010 ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-03 18:37:30552parcourir

Why do I get a

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!

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