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?
Respuesta
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
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
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
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. –
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.
- 1. sizeof estructura vacía es 0 en C y 1 en C++ ¿por qué?
- 2. ¿Por qué sizeof (param_array) es el tamaño del puntero?
- 3. ¿Por qué sizeof (int) es diferente de sizeof (int *)?
- 4. por qué no hay sizeof en java
- 5. ¿Cuál es el tamaño de (main), sizeof (printf), sizeof (scanf)?
- 6. sizeof() parte de una estructura C - tipo de
- 7. ¿Una forma de encontrar el tamaño y la ubicación del relleno en una estructura?
- 8. ¿Cómo puedo encontrar el tamaño de una estructura?
- 9. ¿Por qué el tamaño de una clase vacía en C++ no es cero?
- 10. ¿por qué es posible utilizar estructura indefinida en c
- 11. Cómo escapar de forma segura una cadena de C++
- 12. Es !! una forma segura de convertir a bool en C++?
- 13. ¿Puedo obtener el tamaño de un campo de estructura sin crear una instancia de la estructura?
- 14. ¿Es esta una forma segura de incrementar y obtener el valor de un contador en Django?
- 15. ¿Por qué es -1> sizeof (int)?
- 16. sizeof() estructuras desconocidas. ¿Por qué?
- 17. ¿Por qué el tubo de multiprocesamiento Python no es seguro?
- 18. sizeof() aplicada a la estructura y variables
- 19. ¿Por qué la lectura no es segura para subprocesos?
- 20. ¿cuál es el mecanismo de sizeof() en C/C++?
- 21. ¿Por qué sizeof (string) == 32?
- 22. por qué "f = f ++" no es seguro en c?
- 23. ¿por qué sizeof ('a') es 4 en C?
- 24. Operador sizeof C/C++: ¿Por qué sizeof ('a') devuelve valores diferentes?
- 25. Obtener tamaño de struct en C#
- 26. C y C++ diferencia en sizeof ('x')
- 27. C# sizeof decimal?
- 28. ¿Por qué este código no es seguro para subprocesos?
- 29. ¿Por qué ConcurrentHashMap.putifAbsent es seguro?
- 30. ¿Por qué Git no me permite eliminar de forma segura una sucursal?
Definir seguro. 'Marshal.SizeOf' es perfectamente seguro en lo que respecta al CLR. – Noldorin
Noldorin - Marshal.SizeOf requiere permiso del Código UnSafe para ejecutarse. Este es el problema del OP –
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