2010-03-10 13 views
5

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?

+0

Definire sicuro. 'Marshal.SizeOf' è perfettamente sicuro per quanto riguarda il CLR. – Noldorin

+1

Noldorin - Marshal.SizeOf richiede l'autorizzazione Codice UnSafe impostato per l'esecuzione. Questo è il problema dell'OP –

+0

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

risposta

3

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

+3

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

+1

concordato. Stavo solo cercando di rispondere alla domanda originale: "perché sizeof è pericoloso e come ottenere dimensioni di una struttura in modo sicuro?" :-) – Jcl

+1

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

0

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.

Problemi correlati