Ho definito una struttura da inviare tramite socket. Mi piacerebbe avere la dimensione di esso ma sizeof
non è sicuro e lo stesso vale per "System.Runtime.InteropServices.MarshalSizeOf
". C'è un modo per ottenere le sue dimensioni in modo sicuro?C# perché sizeof non è sicuro e come ottenere dimensioni di una struttura in modo sicuro?
risposta
Non esiste un modo per farlo per le strutture gestite. Marshal.SizeOf
restituirà solo la dimensione dei dati sui tipi di marshalling che comprendono la struttura ... che MIGHT essere corretti per i tipi gestiti su alcune piattaforme, ma non su altri.
Questo è progettato in modo che il JIT possa porre le strutture in modo diverso a seconda della piattaforma su cui viene eseguito.
Maggiori informazioni qui: Chris Brumme's blog
La domanda importante è perché è necessario conoscere la dimensione della struttura? Le probabilità sono per un motivo non sicuro (nel qual caso è possibile utilizzare 'sizeof') o è per un P/Invoke (nel qual caso' Marshal.SizeOf' è la risposta corretta). – Gabe
concordato. Stavo solo cercando di rispondere alla domanda originale: "perché sizeof è pericoloso e come ottenere dimensioni di una struttura in modo sicuro?" :-) – Jcl
Una ragione: si desidera creare una matrice di molte strutture e è necessario sapere quante ne possono contenere in 2 GB. È necessario conoscere la quantità di memoria allocata dal runtime per la struttura. –
Vedi my blog post per una libreria wrapper che consente di determinare ciò che il JIT sarà definire le dimensioni del tipo gestito sarà (in fase di esecuzione). Funziona usando l'istruzione IL sizeof
che non è esposta affatto in C#. Può essere eseguito senza autorizzazioni speciali ed è verificabile.
Nota: questo potrebbe o non potrebbe essere ciò che si desidera effettivamente. Questo potrebbe restituire 8
per una struttura che in realtà contiene solo un singolo byte. Non capisco completamente la tua domanda, quindi non sono sicuro che questo sia effettivamente ciò che vuoi o no.
- 1. Perché è più sicuro da usare sizeof (* puntatore) in malloc
- 2. vuoto * come generico in C, è sicuro?
- 3. Perché CopyOnWriteArrayList è sicuro?
- 4. Perché eval non è sicuro in javascript?
- 5. Come passare una stringa C++ a JNI Java in un modo sicuro per thread sicuro?
- 6. È sicuro restituire una struct in C o C++?
- 7. perché "f = f ++" non è sicuro in c?
- 8. Codice non sicuro in C#
- 9. C'è un puntatore in C# come C++? È sicuro?
- 10. Invia email in modo sicuro
- 11. Qual è la differenza in Swift tra "non proprietario (sicuro)" e "non proprietario (non sicuro)"?
- 12. sizeof() parte di una struttura C - sorta di
- 13. Perché è -freciprocal-math non sicuro in GCC?
- 14. Perché "vapply" è più sicuro di "sapply"?
- 15. Questo è [0] sicuro in C++?
- 16. Memorizza una password in modo sicuro
- 17. Dimensioni dello stack di thread sicuro?
- 18. in modo sicuro l'iterazione di WeakKeyDictionary e WeakValueDictionary
- 19. Come scaricare/copiare in modo sicuro una tabella in RedShift?
- 20. Come utilizzare sscanf in modo corretto e sicuro
- 21. Come utilizzare un codice non sicuro in un contesto sicuro?
- 22. Perché MSVC++ considera "std :: strcat" non "sicuro"? (C++)
- 23. Durata dei temporari in C++ - è sicuro?
- 24. Generazione di query SQL in modo sicuro in C#
- 25. PHP exec è sicuro?
- 26. L'uso di gcroot è sicuro?
- 27. Come calcola le dimensioni l'operatore C++ sizeof?
- 28. perché sizeof ('a') è 4 in C?
- 29. Come pubblicare StringBuffer in modo sicuro?
- 30. Come rendere sicuro asio fork sicuro
Definire sicuro. 'Marshal.SizeOf' è perfettamente sicuro per quanto riguarda il CLR. – Noldorin
Noldorin - Marshal.SizeOf richiede l'autorizzazione Codice UnSafe impostato per l'esecuzione. Questo è il problema dell'OP –
Ho provato System.Runtime.InteropServices.MarshalSizeOf (typeof (MyStruct)) e nessun "non sicuro" ovunque e anche deselezionato la casella di controllo Consenti codice non sicuro. Funziona bene per me ora. ?????? – 5YrsLaterDBA