6
votes

Fonction d'appel d'erreur, [un appel à la fonction de pinvoke déséquilibré la pile]

J'ai le code suivant, une fois mon application, je reçois cette erreur

Quelqu'un sache comment je corrige cette erreur?

Erreur:

Un appel à la fonction Pinvoke ' testcamera! edsdklib.edsdk :: edsdownloadevfimage 'a déséquilibré la pile. Ceci est probable parce que la signature de Pinvoke gérée ne correspond pas à la signature cible non gérée. Vérifiez que la convention d'appel et les paramètres de la signature de Pinvoke correspondent à la signature non gérée de la cible xxx


3 commentaires

Veuillez fournir plus d'informations -Dllimport, edsdownloadevfImage Signature


Ceci est mon dllimport, [dllimport ("edsdk.dll")] Public extern statique UINT EDSCreateVFIMageref (intPTR INTREAMRF, OUT INTPTR OUTEVFIMagerEF);


Et quelle est la signature native de la fonction?


3 Réponses :


3
votes

Lorsque vous effectuez une plate-forme invoquée (p / invoke), vous devez dire au CLR quels sont les paramètres (qui détermine la manière dont ils sont marqués) ainsi que la convention appelante de la méthode native cible, afin que le temps d'exécution sache. Comment générer du code pour pousser correctement les arguments et nettoyer la pile après l'appel. Si les signatures ne correspondent pas, vous vous retrouvez avec des erreurs d'exécution similaires à ce que vous voyez.

Le message d'erreur explique le problème bien:

Ceci est probable parce que la signature de Pinvoke gérée ne correspond pas à la signature cible non gérée. Vérifiez que la convention d'appel et les paramètres de la signature de Pinvoke correspondent à la signature non gérée de la cible

comparer la signature P / invoke pour edsdk.edscreeeevfimageref contre la signature méthode native réelle qui implémente ceci.

Vous pouvez modifier la convention appelante de la P / invoquée en spécifiant appelingconvention propriété sur le dllimport attribut. Plus que probablement, la convention appelante pour edsdk.edscreeeevfimageref devrait correspondre à la convention d'appel de vos autres p / invoques.


5 commentaires

J'ai mis ma dll importer, [dllimport ("edsdk.dll")] Public externe statique UINT EDSCreateVefIMageref (intPTR INTREAMRF, OUT INTPTR OUTEVFIMageref); Où est mon code mal?


À quoi ressemblent vos autres p / invoques? Qu'est-ce que la signature native pour edsdownloadevfImage ressemble?


Je ne sais pas où je peux trouver cette signature de code natif, je n'ai pas la source de ma DLL. Je n'ai que la dll elle-même


@ User1400: Dans ce cas, vous aurez besoin de la documentation pour vous dire. Si cette DLL fait partie de certains SDK, je m'attendrais à ce qu'elle vienne avec un fichier .h ou une autre description du code du contenu. Si la DLL n'est pas de certains SDK, êtes-vous sûr que cela est même possible (et légal) d'appeler toutes les fonctions qu'il exporte?


sa partie de SDK (EDSDK 2.8 pour la caméra Canon) et il a un fichier d'en-tête



25
votes

Veuillez utiliser la convention de l'appel de CDECL pour cette fonction. Ne me demandez pas pourquoi, cela fonctionne simplement. XXX


1 commentaires

CDECL : L'appelant nettoie la pile. Cela permet des fonctions d'appel avec Varargs, ce qui permet d'utiliser des méthodes qui acceptent un nombre variable de paramètres. Il rend chaque appel de fonction pour inclure le code de nettoyage de la pile. msdn.microsoft.com/en-us/library/ ...



3
votes

J'avais le même problème que l'affiche, s'est avéré que je devais changer mon projet à l'aide de la bibliothèque EDSDK (V2.10) pour utiliser .NET 3.5 au lieu de .NET 4.0.


1 commentaires

J'ai aussi eu le problème similaire et j'ai été résolu en faisant ma version de .NET à 3.5