Eu defini uma estrutura para um pacote de dados definido externamente da seguinte maneira:
[StructLayout(LayoutKind.Explicit, Size=18, Pack=1, CharSet=CharSet.Ansi)]
struct FlexTransmission
{
[FieldOffset(0), MarshalAs(UnmanagedType.U4, SizeConst =4)]
public UInt32 transmissionTime;
[FieldOffset(4),MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)]
public byte[] flexData; // size 13 bytes
[FieldOffset(17)]
public byte transmissionNumber;
}
Porém esta estrutura é considerada errada pelo compilador (# 11, .NET 7):
System.TypeLoadException: 'Não foi possível carregar o tipo 'Flex.FlexTransmission' do assembly 'Flex, Versão=1.0.0.0, Culture=neutral, PublicKeyToken=null' porque contém um campo de objeto no deslocamento 4 que está alinhado incorretamente ou sobreposto por um campo não-objeto.'
Não consigo ver onde poderia estar a sobreposição. Certamente um UInt32 não ocupa mais de 4 bytes em C#?
O layout explícito trata de como os dados são armazenados no espaço gerenciado, e isso exige que as referências estejam alinhadas ao tamanho da referência. Na realidade, você simplesmente não deveria usar layout explícito para qualquer coisa que contenha uma referência - e o array aqui: é uma referência.
Gostaria de saber se em vez de usar um
byte[]
, você deveria ter usado um buffer fixo ; que não tem essa restrição: