Exception PInvokeStackImbalance sur appel à du code non managé

Signaler
Messages postés
18
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2013
-
Messages postés
18
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2013
-
Bonjour,

Lorsque je débugge mon code, l'exception suivante est levée (alors qu'aucun problème n'est remonté à l'exécution) lorsque je fais appel à une méthode d'une DLL importée non managée (NB : aucun message d'erreur quand ma fonction C ne possède pas de paramètres (void)):

PInvokeStackImbalance a été détecté
Message: Un appel à la fonction PInvoke 'maClasse!maClasse.Modele+MethodeImporteDelegate_MaFonction::Invoke' a déséquilibré la pile.
Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée.
Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

Mon code C# permet de faire appel à un point d'entrée d'une DLL en C.

Prototype de ma fonction C :
.h : 
void maFonctionC (__int32 var);
.c : 
void maFonctionC  (__int32 var)
{
...
}


        #region Win32
        // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/loadlibrary.asp
        [DllImport("Kernel32.dll")]
        private static extern IntPtr LoadLibrary(
            [In] string lpFileName
            );

        // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getprocaddress.asp
        [DllImport("Kernel32.dll")]
        private static extern IntPtr GetProcAddress(
            [In]IntPtr hModule,
            [In]string lpProcName
            );
        #endregion

//Déclaration
private delegate void MethodeImporteDelegate_MaFonction(int notused);
private MethodeImporteDelegate_MaFonction _methodeImporte_MaFonction = null;

//Chargement dynamique de la DLL C
DllHModule = LoadLibrary(pathDllC);

IntPtr procAddress = GetProcAddress(DllHModule, "maFonctionC");

_methodeImporte_MaFonction = (MethodeImporteDelegate_MaFonction)Marshal.GetDelegateForFunctionPointer(procAddress, typeof(MethodeImporteDelegate_MaFonction));

public IntPtr AppelMethodeAvecArgument(int param) 
{
// Lancement de l'appel via le delegate
       _methodeImporte_MaFonction.Invoke(param); -> Exception levée ici en Débug
}


J'ai pourtant bien vérifié le prototypage en C# et en C, je ne vois pas ce qui cause souci...

Merci de votre aide.

Pascal

1 réponse

Messages postés
18
Date d'inscription
jeudi 24 décembre 2009
Statut
Membre
Dernière intervention
13 mars 2013

J'oubliais...

En exécution sans débug, aucune exception n'est levée et le paramètre est correctement tranmis à ma fonction C...
Mais il me faut corriger cette exception quand même non ? Cela a/peut/doit avoir des effets de bord sur la mémoire non ?

Merci grandement.

Pascal