2010-03-10 3 views
5

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?

+0

Définir le coffre-fort. 'Marshal.SizeOf' est parfaitement sûr en ce qui concerne le CLR. – Noldorin

+1

Noldorin - Marshal.SizeOf requiert l'exécution du code UnSafe. C'est le numéro de l'OP –

+0

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

Répondre

3

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

+3

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

+1

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

+1

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. –

0

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.

Questions connexes