Voilà j'utilise une dll que j'ai développé en C, dans un programme C#.
Quand j'appel une fonction de la dll par DLLImport, au moment ou le programme passe sur l'appel de cette méthode, celà me génére une exception du type "Is not PInvoke compatible"
J'avoue en perdre mon latin.
Ai-je fait une fausse manip dans l'appel de la fonction ?
C'est au niveau de la signature que celà coince ?
Method's type signature is not PInvoke Compatible
Ma méthode retourne une structutre contenant des enums un bool et un char *. C'est quand j'utilise ce char* que celà me génére une exception. Dans mon appli en C# je déclare une structlayout de la même ossature que celle dans ma dll en C.
Ensuite j'utilise la méthode Importé par dllimport comme suit : struct = getStruct();
C'est une MarshallDirectiveException qui est levée.
Voici le code.
Dans ma mfc en c dans le .h je déclare la première structure
puis la deusième
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 typedef struct _maStruct { char* nom; enumDefaut def; enumEtat etat; _structLigne ligne; } maStruct;
le prototype de ma méthode
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 typedef struct _structLigne { char* text; bool ok; } structLigne;
puis dans mon .cpp principale ma méthode
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef _maStruct (WINAPI *DLL_Function_GET_Struct(void));
Dans mon .cs je déclare mes structures
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 _maStruct GET_Struct(void) { _maStruct struct; // traitement sur ma structure return struct; }
de même pour _structLigne. Après :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 [StructLayout(LayoutKind.Sequential)] public struct _maStruct { public string nom; etc.... }
je l'utilise aprés comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [DllImport(@"..\..\..\release\MADLL.dll")] public static extern _maStruct GET_Struct();
En rouge se qui génére l'exception.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 private void button1_Click(object sender, EventArgs e) { _maStruct struct; struct = GET_Struct(); Console.Writeline(struct.nom); }
voilà
Merci
X.
Partager