2011-11-01 7 views
8

Come dichiaro matrice a dimensione fissa di un tipo di struttura in C#:Dimensione fissa Array di tipo Struttura

[StructLayout(LayoutKind.Sequential,Pack=1), Serializable] 
public unsafe struct MyStruct{ 
    ... 
} 

public class MyClass { 
    ... 
    public fixed MyStruct myStruct[256]; 
} 

questo si tradurrà a CS1663: fisso buffer size di tipo struct non è consentito, come faccio soluzione alternativa, preferisco non utilizzare il tipo C# o il tipo "Struttura dati raccolta gestita", poiché è necessario effettuare il marshalling in C++ nativo

risposta

9

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.

3

Non è possibile; per the definition

L'unica restrizione è che il tipo di matrice deve essere bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, o double.

+0

nessuna soluzione alternativa? quindi posso farlo in C++? – uray

+0

@sicuramente l'unica cosa che posso suggerire è un array normale. Se questo non è possibile, allora ... –