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 : 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;
        }
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
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 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.
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 ?