Marshal struct non géré en code géré à l'aide de C #
-
06-07-2019 - |
Question
Je dois traiter les octets [] lorsque je viens d'une application externe. L'application externe est également réalisée en C # et ils envoient les octets via UDP. Ils envoient les octets convertis à partir de la structure, comme indiqué ci-dessous:
public struct DISPATCH_MESSAGE
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] federation_name; // Units: nil Range: nil
}
Ainsi, lorsque je reçois les octets, je dois retirer le caractère [] à l'intérieur de celui-ci et obtenez la chaîne de ce caractère [].
Je suis nouveau dans ce type de codage non géré.
La solution
Vous devriez probablement le déclarer comme ByValTStr
(selon la nature de la chaîne, celle-ci pourrait être différente):
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DISPATCH_MESSAGE{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string federation_name;
}
UPDATE: si un code char []
est déjà généré, il effectue probablement la conversion nécessaire (y compris le traitement de l'encodage), alors je pense que vous aurez simplement besoin :
string str = new string(instance.federation_name);