Pourquoi suis-je “PInvokeStackImbalance a été détecté” pour cet exemple simple?
Je suis de la création d'un très simple PInvoke exemple:
extern "C" __declspec(dllexport) int Add(int a, int b)
{
return a + b;
}
[DllImport("CommonNativeLib.dll")]
extern public static int Add(int a, int b);
return NativeMethods.Add(a, b);
Mais à chaque fois que j'appelle le ci-dessus NativeMethods.Add
méthode j'ai le géré debug adjoint:
PInvokeStackImbalance a été détecté
Message: Un appel à PInvoke fonction " CommonManagedLib!CommonManagedLib.NativeMethods::Ajouter' a déséquilibré la pile. C'est probablement parce que la gestion de PInvoke la signature ne correspond pas à la non géré cible signature. Vérifiez que la convention d'appel et les paramètres de la PInvoke signature correspondre à la cible non géré signature.
L'appel, puis se termine avec la valeur de retour attendue, mais ayant la MDA message apparaît-il est à la fois gênant et inquiétant - je ne comprends pas tout PInvoke encore, mais de ce que j'ai lu, je suis sûr que ma signature est correcte - ce que je fais mal?
C'est tous sur un 32-bit OS.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'utiliser à la place soit
ou
régulier de fonctions C fonctionnent différemment que les fonctions de l'API Windows; leur "conventions d'appel" sont différentes, sens comment ils passent autour de paramètres est différent. (Cela a été évoqué dans l'erreur.)
int __stdcall
a fonctionné pour moi au lieu de__stdcall int
....La Pile Déséquilibre raisons sont la signature ne correspond pas à d'autre Convention d'Appel par défaut de convention d'appel est stdcall. Lorsque votre convention d'appel est stdcall appelant nettoie la pile si vous voulez de l'appelant pour nettoyer la pile nous cdecl convention d'appel. vous pouvez trouver plus de Ici
Mais si vous êtes confrontés en raison de la signature, il suffit d'aller à travers le lien ci-dessus
Résoudre basée sur la Signature de la Pile Déséquilibre problèmes à l'aide de PInvoke extension