es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Campos de estructuras desalineadas en C# con un diseño explícito.

Estoy intentando serializar una estructura que tiene el siguiente diseño:

[StructLayout(LayoutKind.Explicit, Pack = 2)]
public readonly struct EntryInfo
{
[FieldOffset(0x00)]
[MarshalAs(UnmanagedType.U2, SizeConst = 2)]
public readonly ushort Type;

[FieldOffset(0x02), MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public readonly string Name;

}

Desafortunadamente, incluso aunque se especifica Pack=2 y MarshalAs(UnmanagedType.U2), aún falla en tiempo de ejecución con:

System.TypeLoadException: No se puede cargar el tipo ‘Structs.EntryInfo’ del ensamblado ‘MySharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null’ porque contiene un campo de objeto en el desplazamiento 2 que está incorrectamente alineado o se superpone con un campo no objeto.

El objetivo es seguir usando desplazamientos de campo explícitos (de ahí que se requiera el tipo de diseño Explícito), pero aún así admitir campos alineados/sin alinear.

Establecer el diseño como Secuencial y mantener la opción Pack hace que funcione, pero tengo algunas estructuras cuyos datos sé que empiezan no al principio de la estructura, por lo que me gustaría evitar tener que usar un diseño secuencial y crear campos de relleno.

Si establezco el diseño en Secuencial y mantengo el campo Pack, todo funciona, pero no puedo ver realmente por qué el código actual no debería funcionar, es decir, he especificado los tipos administrados correctos, he establecido el pack.

Basándome enhttps://stackoverflow.com/questions/6891867/incorrectly-alined-non-object-field-in-struct entiendo que el array debería estar alineado en DWORD, pero no explica por qué ese es el caso o por qué ese requisito desaparece con el modo Secuencial.

Tags:  , ,

Answer

Comments are closed.