Appel de dll C++ à partir de C#
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:
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:
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.:aie:
Quelqu'un peut m'aider svp ?