Se il C# struct utilizza solo tipi di dati primitivi e ha esattamente lo stesso layout della tua struttura nativa in C++, puoi aggirare queste restrizioni con la memoria manuale m codice di gestione e non sicuro. Come bonus, migliorerai le prestazioni evitando il marshalling.
allocare la memoria:
IntPtr arr = Marshal.AllocHGlobal (sizeof (MyStruct) * 256);
Questo è fondamentalmente malloc
, quindi la memoria allocata è fuori dalla consapevolezza del GC.
È possibile passare l'IntPtr al codice nativo come se fosse uno MyStruct[256]
e solo l'IntPtr verrà eseguito il marshalling, non la memoria a cui punta. Il codice nativo e gestito può accedere direttamente alla stessa memoria.
Per leggere/scrivere la struct nella matrice con C#, utilizzare C# puntatori:
static unsafe MyStruct GetMyStructAtIndex (IntPtr arr, int index)
{
MyStruct *ptr = ((MyStruct *)arr) + index;
return *ptr;
}
static unsafe void SetMyStructAtIndex (IntPtr arr, int index, MyStruct value)
{
MyStruct *ptr = ((MyStruct *)arr) + index;
*ptr = value;
}
Non dimenticate di
Marshal.FreeHGlobal (arr);
quando hai finito con la memoria, a free
esso.
fonte
2011-11-01 23:25:56
nessuna soluzione alternativa? quindi posso farlo in C++? – uray
@sicuramente l'unica cosa che posso suggerire è un array normale. Se questo non è possibile, allora ... –