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) { ... }J'ai pourtant bien vérifié le prototypage en C# et en C, je ne vois pas ce qui cause souci...
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'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
Partager