2010-03-10 11 views
5

He definido una estructura para enviar a través de socket. Me gustaría obtener el tamaño, pero sizeof es inseguro y lo mismo para "System.Runtime.InteropServices.MarshalSizeOf". ¿Hay alguna forma de obtener su tamaño de forma segura?C# ¿Por qué sizeof no es seguro y cómo obtener el tamaño de una estructura de forma segura?

+0

Definir seguro. 'Marshal.SizeOf' es perfectamente seguro en lo que respecta al CLR. – Noldorin

+1

Noldorin - Marshal.SizeOf requiere permiso del Código UnSafe para ejecutarse. Este es el problema del OP –

+0

He intentado System.Runtime.InteropServices.MarshalSizeOf (typeof (MyStruct)) y no es "inseguro" en ninguna parte y también desmarqué la casilla de verificación Permitir código no seguro. Me funciona bien ahora. ?????? – 5YrsLaterDBA

Respuesta

3

No hay forma de hacerlo para las estructuras administradas. Marshal.SizeOf solo devolverá el tamaño de los datos en los tipos mapeados que comprenden la estructura ... que MIGHT es correcto para los tipos administrados en algunas plataformas, pero no en otras.

Esto es por diseño por lo que el JIT puede colocar estructuras de manera diferente según la plataforma en la que se ejecuta.

Más información aquí: Chris Brumme's blog

+3

La pregunta importante es ¿por qué necesitas saber el tamaño de la estructura? Las probabilidades son por una razón insegura (en cuyo caso puede usar 'sizeof') o por una P/Invoke (en cuyo caso' Marshal.SizeOf' es la respuesta correcta). – Gabe

+1

De acuerdo. Solo intentaba responder a la pregunta original: "¿por qué sizeof no es seguro y cómo obtener el tamaño de una estructura de forma segura?" :-) – Jcl

+1

Una razón: desea crear una matriz de muchas estructuras y necesita saber cuántas caben en 2 GB. Necesita saber cuánta memoria asignará el tiempo de ejecución a la estructura. –

0

Ver my blog post para una biblioteca envoltorio que le permite determinar cuál es el JIT definir el tamaño del tipo administrado será (en tiempo de ejecución). Funciona utilizando la instrucción sizeof IL que no está expuesta en absoluto en C#. Se puede ejecutar sin permisos especiales y es verificable.

Nota: esto puede ser o no lo que realmente desea. Esto podría devolver 8 para una estructura que en realidad solo tiene un solo byte. Realmente no entiendo completamente tu pregunta, así que no estoy seguro si esto es realmente lo que quieres o no.

Cuestiones relacionadas