Tenir compte de la struct suivante à envoyer sur TCP à un dll non géréPassage des chaînes non terminées par null au code non managé
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct FooMessage
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 42)]
public string foo;
//More fields...
}
En utilisant la fonction suivante (crédit Cheeso):
public byte[] RawSerialize(T item)
{
int rawSize = Marshal.SizeOf(typeof(T));
IntPtr buffer = Marshal.AllocHGlobal(rawSize);
Marshal.StructureToPtr(item, buffer, false);
byte[] rawData = new byte[ rawSize ];
Marshal.Copy(buffer, rawData, 0, rawSize);
Marshal.FreeHGlobal(buffer);
return rawData;
}
problème : Le marshaller suppose que foo est une chaîne terminée par zéro, alors que la DLL non gérée ne le fait pas - et utilise en fait le dernier char (qui sort toujours nul du marshaller).
Des idées? Je ne peux pas simplement changer le SizeConst en 43, parce que je dois maintenir la taille totale du message, aussi bien que la position des champs suivant dans la structure (selon un ICD existant)
L'utilisation d'un caractère [] est en effet le moyen de le faire. –