2009-04-08 9 views
8

He la siguiente estructura en C#:Cómo ordenar una matriz de estructuras en C#?

[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct RECORD 
{ 
    public uint m1; 
    public uint m2; 
    public uint m3; 
} 

necesito demasiado pasar una serie (longitud fija) de estas estructuras a código nativo, que escribe algunos datos de estas estructuras. La matriz se asigna en C# y se pasa a la dll C. Declaré la función importada como:

[DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern void doIt(RECORD[] dataRecord); 

pero no obtengo ninguna información. Ya probé con el Asistente de interoperabilidad de Invoke. ¿Debería usar IntPtr aquí? ¿Algunas ideas?

Editar:

Este es el código C# para llamar a la función nativa:

RECORD[] rec = new RECORD[256]; 
doIt(rec); 
// values of rec are all zero here 

Aquí es la función C:

int doIt(RECORD* rec) 
{ 
    // deref pointer and write some data 
} 

Respuesta

13

Estoy lejos de ser un P/Invoque a un experto, pero me pregunto si convertirlo en un parámetro de entrada/salida podría ayudar:

DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern void doIt([In, Out] RECORD[] dataRecord); 

No esperaba esperado que sea necesario, como con LayoutKind.Sequential Espero que su estructura ya sea un tipo blittable, y que la matriz también sea blittable.

+0

Eso hizo el truco, thx. ¿Hay otros lugares donde se usan estas palabras clave? Nunca los he visto antes – SDD

+1

De MSDN: [refiriéndose a matrices de tipos blittable] Sin embargo, estos tipos se calculan como parámetros In, y debe aplicar los atributos InAttribute y OutAttribute si desea ordenar el argumento como un Parámetro In/Out. – SDD

+0

Gracias esto funcionó para mí, y terminó una lucha de dos horas para hacer esto. –

Cuestiones relacionadas