Рассмотрим следующую структуру для отправки по TCP на неуправляемую dll
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct FooMessage
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 42)]
public string foo;
//More fields...
}
Используя следующую функцию (кредит 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;
}
Проблема: маршаллер предполагает, что foo является строкой с нулевым символом в конце, тогда как неуправляемая dll этого не делает - и фактически использует последний символ (который всегда получается нулевым из маршаллера).* Уточнение : Я не могу просто изменить SizeConst на 43, потому что мне нужно сохранить общий размер сообщения, а также положение следующих полей в структуре (в соответствии с существующим ICD)