Un appel à PInvoke fonction '[...]' a déséquilibré la pile
J'obtiens cette erreur bizarre sur certains trucs que j'ai utilisé pendant un bon moment. Il peut être une chose nouvelle dans Visual Studio 2010, mais je ne suis pas sûr.
Je suis en train d'appeler un unamanged fonction écrite en C++ C#.
De ce que j'ai lu sur internet et le message d'erreur lui-même, il a quelque chose à voir avec le fait que la signature dans mon fichier C# n'est pas la même que celle de C++, mais je ne peux vraiment pas le voir.
Tout d'abord c'est mon unamanged fonction ci-dessous:
TEngine GCreateEngine(int width,int height,int depth,int deviceType);
Et voici ma fonction en C#:
[DllImport("Engine.dll", EntryPoint = "GCreateEngine", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CreateEngine(int width,int height,int depth,int device);
Quand je debug en C++, je vois tous les arguments que l'on vient fine donc je ne peux que penser qu'il a quelque chose à voir avec la transformation de TEngine (qui est un pointeur vers une classe nommée CEngine) à IntPtr. J'ai utilisé cette avant dans VS2008 sans problème.
- Salut à tous, je suis confronté à la même question, mais avec Visual studio 2013. J'ai ajouté directement référence de dll c++ pour mon projet c# qui fonctionnait bien, en 2010, mais pas en 2013. J'ai également mentionné CallingConvention.Cdecl
Vous devez vous connecter pour publier un commentaire.
Peut-être que le problème réside dans la convention d'appel. Êtes-vous sûr que non managé fonction a été compilée en tant que stdcall et pas autre chose ( je suppose fastcall ) ?
J'ai eu un _cdecl dll c++ que j'ai appelé, sans aucun problème à partir de Visual Studio 2008, puis l'identique de code dans Visual Studio 2010 ne serait pas de travail. J'ai eu le même PInvoke ... a déséquilibré la pile d'erreur ainsi.
La solution pour moi a été de préciser la convention d'appel dans l'DllImport(...) attribut:
De:
À:
Je suppose qu'ils ont changé la convention d'appel par défaut pour DLLImport entre .NET 3.5 et .NET 4.0?
Il se pourrait aussi que dans le .NET Framework version 3.5, la pInvokeStackImbalance MDA est désactivé par défaut. En vertu de l'4.0 (ou peut-être VS2010) il est activé par défaut.
Un moyen facile de résoudre ce problème est de spécifier la convention d'appel et assurez-vous qu'il est le même que dans la DLL. Un
__declspec(dllexport)
devrait donner un cdecl format.Utiliser le code suivant, si par exemple votre fichier DLL a le nom MyDLL.dll et vous souhaitez utiliser la fonction MyFunction dans la Dll
cela a fonctionné pour moi.
Dans mon cas (VB 2010 et DLL compilé avec Intel Fortran 2011 XE) le problème existe lorsque mon application cible .NET Framework 4. Si je change ciblées framework version 3.5, puis tout fonctionne bien comme prévu.
Donc, je pense que la raison est quelque chose de introduit en .Net Framework 4, mais je n'ai aucune idée du moment où un
Mise à jour: Le problème a été résolu par la recompilation de DLL Fortran et spécifiant explicitement STDCALL que l'appel à la convention pour les noms des exportations dans la DLL.