J'ai défini une structure à envoyer via socket. Je voudrais obtenir la taille de celui-ci, mais sizeof
est dangereux et la même chose pour "System.Runtime.InteropServices.MarshalSizeOf
". Y a-t-il un moyen d'obtenir sa taille de façon sécuritaire?C# pourquoi sizeof est dangereux et comment obtenir la taille d'une structure de manière sûre?
Répondre
Il n'existe aucun moyen de le faire pour les structures gérées. Marshal.SizeOf
ne retournera que la taille des données sur les types marshalés qui composent la structure ... que MIGHT être correct pour les types gérés sur certaines plates-formes, mais pas sur d'autres.
Ceci est dû au fait que le JIT peut créer des structures différemment selon la plate-forme sur laquelle il fonctionne.
Plus d'infos ici: Chris Brumme's blog
La question importante est pourquoi avez-vous besoin de connaître la taille de la structure? Les chances sont pour une raison non sûre (auquel cas vous pouvez utiliser 'sizeof') ou pour un P/Invoke (auquel cas' Marshal.SizeOf' est la bonne réponse). – Gabe
D'accord. Essayait juste de répondre à la question initiale: "pourquoi sizeof est dangereux et comment obtenir la taille d'une structure de manière sûre?" :-) – Jcl
Une des raisons: vous voulez créer un tableau de nombreuses structures et vous devez savoir combien peuvent tenir dans 2 Go. Vous devez connaître la quantité de mémoire allouée à la structure par l'exécution. –
Voir my blog post pour une bibliothèque wrapper qui vous permet de déterminer ce que le JIT définira la taille de type managé sera (à l'exécution). Il fonctionne en utilisant l'instruction sizeof
IL qui n'est pas du tout exposée en C#. Il peut être exécuté sans aucune autorisation spéciale et est vérifiable.
Remarque: cela peut être ou ne pas être ce que vous voulez réellement. Cela peut renvoyer 8
pour une structure qui ne contient réellement qu'un seul octet. Je ne comprends pas vraiment votre question complètement, donc je ne suis pas sûr si c'est réellement ce que vous voulez ou non.
- 1. Sizeof rapports incorrect Taille de la structure définie type -
- 2. sizeof structure vide est 0 en C et 1 en C++ pourquoi?
- 3. Quelle est la taille de (principal), sizeof (printf), sizeof (scanf)?
- 4. Comment sizeof calcule la taille des structures
- 5. Taille du tampon: N * sizeof (type) ou sizeof (var)? C++
- 6. Comment calculer la taille de la classe dans java ..? Est une méthode comme sizeof() dans c ..?
- 7. C++ sizeof (...)
- 8. Comment étendre un TFieldDef de manière simple et sûre?
- 9. Pourquoi est-ce que j'obtiens l'erreur "Le code dangereux peut n'apparaître que si la compilation avec/n'est pas sûre"?
- 10. Manière sûre de coder une valeur de cookie dans C#
- 11. Quelle est la taille de cette structure C#?
- 12. C# sizeof decimal?
- 13. sizeof un membre struct
- 14. Quelle est la manière la plus sûre/appropriée d'implémenter un modèle singleton thread-safe?
- 15. Manière sûre de changer la priorité d'un NSOperation
- 16. Puis-je obtenir la taille d'un champ struct sans créer une instance de la structure?
- 17. Sizeof ne retourne pas la taille réelle de la variable dans C
- 18. taille de struct en C
- 19. taille de la mémoire de la structure de données Python
- 20. Obtention de la taille d'un champ individuel à partir d'un champ de structure C++
- 21. Obtenir la taille de l'image
- 22. optimisation de la taille de la structure
- 23. Comment obtenir les noms de champ et les offsets d'une structure en utilisant dbghlp et pdb
- 24. sizeof (void) est égal à 1 en C?
- 25. opérateur sizeof dans c
- 26. C# sizeof (enum) alternative? (pour contourner fausse erreur de resharper)?
- 27. Navigateur CSS manière sûre d'appliquer une bordure de rayon?
- 28. Code dangereux dans C#
- 29. Quelle est la différence entre sizeof (int) et sizeof (int *)? Est-ce que cette instruction est int * numbers [] = {....} correct?
- 30. Null est-il dangereux?
Définir le coffre-fort. 'Marshal.SizeOf' est parfaitement sûr en ce qui concerne le CLR. – Noldorin
Noldorin - Marshal.SizeOf requiert l'exécution du code UnSafe. C'est le numéro de l'OP –
J'ai essayé System.Runtime.InteropServices.MarshalSizeOf (typeof (MyStruct)) et non "dangereux" n'importe où et aussi décoché la case Autoriser le code non sécurisé. Cela fonctionne bien pour moi maintenant. ?????? – 5YrsLaterDBA