Maison > développement back-end > C++ > le corps du texte

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

Susan Sarandon
Libérer: 2024-11-03 18:37:30
original
551 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!