2009-07-28 9 views

risposta

21

Dovrete farlo manualmente, dal momento che non c'è modo di dire la P/Invoke strato di quantità di dati il ​​marshalling dal C++ valore di ritorno.

struct OuterStruct { 
    int numberStructs; 
    IntPtr innerStructs; 
}; 

OuterStruct s = getStructs(); // using DllImport 
var structSize = Marshal.SizeOf(typeof(InnerStruct)); 
var innerStructs = new List<InnerStruct>(); 
var ptr = s.innerStructs; 

for (int i = 0; i < s.numberStructs; i++) 
{ 
    innerStructs.Add((InnerStruct)Marshal.PtrToStructure(ptr, 
     typeof(InnerStruct)); 
    ptr = ptr + structSize; 
} 

Si noti che se si vuole liberare la memoria per innerStructs dal codice C#, è necessario utilizzare l'allocatore standard di CoTaskMemAlloc nel codice C++ - allora si può chiamare Marshal.CoTaskMemFree per liberare innerStructs.

+0

Uomo fantastico, grazie mille. Inoltre, come una domanda veloce, è possibile maresciallo di un vettore, in modo che potrei semplicemente avere OuterStruct avere un vettore di InnerStructs? So che non puoi organizzare le lezioni, ma ho pensato che forse qualcuno avesse scritto qualcosa di difficile da fare. – DevDevDev

+0

Non che io sappia, ma non ho mai guardato. :-) –

+0

Hai lanciato il puntatore a 'int'? Cosa succede se è in esecuzione in un processo a 64 bit ?! [Non è necessario il cast] (https://msdn.microsoft.com/en-us/library/system.intptr.op_addition (v = vs.110) .aspx) – doug65536