Bonjour,
Je réalise un programme en C# qui fait appel à une dll écrite en C++.
J'utilise donc les InteropServices pour faire la conversion, mais à l'exécution je me prend un AccessViolationException. Je pense que mes MarshalAs sont mauvais.
Code du programme :
Code d'appel à la dll C++ :
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 [Display(ResourceType = typeof(Ressource), Description = "InitAteDescript")] public int InitAte(out bool errorOccured, out int errorCode, out StringBuilder errorMsg) { ResetParamsErrors(); if (IsInitHalOK()) { StringBuilder errMsg = new StringBuilder(MaxLenght); try { DllApiInitATE(XmlNodeInitAte, out _errorOccured, out _errorCode, errMsg); _errorMsg.Append(errMsg); } catch (Exception ex) { ExceptionAppel(ex); } } ReturnParamsErrors(out errorOccured, out errorCode, out errorMsg); return errorCode; }
Le truc, c'est que le errorCode de la dll C++ est un long sur 4 octets en C++, ce qui correspond à un int sur 4 octets en C#. De même, j'utilise le type unmanaged I1 pour le bool, car le type unmanaged.bool est sur 4 octets.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public const int MaxLenght = 1024; ///Return Type: void ///pstrXmlNode: wchar_t* ///pbErrorOccurred: boolean* ///plErrorCode: int* ///twcErrorMsg: wchar_t* [DllImportAttribute("./LogicalBB.dll", EntryPoint = "LogicalBB_InitATE", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] [return: MarshalAs(UnmanagedType.AsAny)] private static extern void DllApiInitATE([MarshalAs(UnmanagedType.LPWStr), In(), Out()] StringBuilder pstrXmlNode, [MarshalAs(UnmanagedType.I1), Out()] out bool pbErrorOccurred, [MarshalAs(UnmanagedType.I4), Out()] out int plErrorCode, [MarshalAs(UnmanagedType.LPWStr), In(), Out()] StringBuilder twcErrorMsg);
Le pstrXmlNode est un wchar_t de taille variable récupéré d'un fichier xml, et twcErrorMsg est de taille fixe :1024 caractères.
J'ai mes pointeurs qui se marchent sur les pieds et je ne vois pas d'où ça vient.
Quelqu'un peut m'aider svp ?
Partager