2009-07-28 20 views

Respuesta

21

Vas a tener que hacerlo de forma manual, ya que no hay manera de saber la relación P/Invoke capa de la cantidad de datos para calcular la referencia de su C++ devolver el valor.

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; 
} 

Tenga en cuenta que si se quiere liberar la memoria para innerStructs de su código C#, usted tiene que utilizar el asignador estándar CoTaskMemAlloc en código C++ - entonces usted puede llamar Marshal.CoTaskMemFree para liberar innerStructs.

+0

Hombre genial, muchas gracias. Además, como una pregunta rápida, ¿es posible Mariscal vector, de modo que podría tener OuterStruct tener un vector de InnerStructs? Sé que no se pueden organizar las clases, pero pensé que tal vez alguien había escrito algo complicado para hacer esto. – DevDevDev

+0

No es que yo sepa, pero nunca he buscado. :-) –

+0

¿Lanzaste el puntero a 'int'? ¿Qué sucede si se ejecuta en un proceso de 64 bits? [No necesita los moldes] (https://msdn.microsoft.com/en-us/library/system.intptr.op_addition (v = vs.110) .aspx) – doug65536

Cuestiones relacionadas