Exception PInvokeStackImbalance sur appel à du code non managé
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:
1 2 3 4 5 6 7 8
| Prototype de ma fonction C :
.h :
void maFonctionC (__int32 var);
.c :
void maFonctionC (__int32 var)
{
...
} |
Code:
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