Je cherche à intégrer une dll dans un programme écrit en c#. J'essaie de convertir un programme en C déjà existant et qui fonctionne en du c#. Plusieurs fonctions de l'API fonctionnent mais la fonction ScanAndRecognize() ne fonctionne pas. Cette fonction est appelée mais je ne récupère pas les données.


programme en C (qui fonctionne)

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
//////// In a File.h:
 
MOCRAPI_USAGE bool ScanAndRecognize(char *cData, int nDataSz); 
 
 
 
//////// In a File .c:
 
char cMrzData[1000];
memset(cMrzData, NULL, sizeof(cMrzData)); 
 
if (ScanAndRecognize(cMrzData, sizeof(cMrzData) - 1) == false)
PrintError();
else
{
// Print the result
cout << "Received recognition output:" << endl << endl;
for (int i = 0 ; cMrzData != 0 ; i++)
if (cMrzData != '\r')
cout << cMrzData;
else
cout << endl;
}


Programme que j'essaie de faire en c#:

1) J'ai essayé avec un pointeur:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
[DllImport("mOcrApi_dbg.dll", CharSet=CharSet.Auto)]
 
public unsafe static extern bool ScanAndRecognize(char *cData, int nDataSz);


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
unsafe
 
{
 
char[] mrz_data = new char[100];
 
fixed (char* mrz = mrz_data)
 
 
bool1 = ScanAndRecognize(mrz, 99);
 
}
2) J'ai essayé avec un type IntPtr:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
public IntPtr cData;
[DllImport("mOcrApi_dbg.dll", CharSet=CharSet.Auto)]
public unsafe static extern bool ScanAndRecognize(ref IntPtr cData, int nDataSz); 
 
// Call:
 
bool1 = ScanAndRecognize(ref cData, 1000);
textBox1.Text = Marshal.PtrToStringAnsi(cData);


Dans les 2 cas, j'ai un message d'erreur lorsque la dll me retourne les données. Je pense que le problème vient du type (pointeur) que je n'interprète pas comme il faut. Message d'erreur :

An unhandled exception of type 'System.AccessViolationException' occurred in Essai_api_desko.exe. Additional information: Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.