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.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
Prototype de ma fonction C :
.h : 
void maFonctionC (__int32 var);
.c : 
void maFonctionC  (__int32 var)
{
...
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
        #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...

J'oubliais :

En exécution sans débug, aucune exception n'est levée et le paramètre est correctement transmis à 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 de votre aide.

Pascal