2009-08-06 34 views
7

Usted tiene una estructura que tiene una matriz de bytes sin embargoMarshalling un tamaño de matriz desconocida

byte[] 

, el tamaño de esa matriz depende de la imagen que está presentando (ancho x alto)

Entonces ... ¿cómo Qué haces

[MarshalAs(UnmanagedType.ByValArray, SizeConst = ???)] 
public Byte[] ImageData; 

¿está el SizeConst DEBE TENER cuando se trabaja con matrices de bytes que se transmiten de C# para C dlls?

+0

Un Marshaller personalizado parece ser la única opción. – IllidanS4

Respuesta

2

Debe cambiar el tipo de clasificación. Se requiere SizeConst si se está organizando como ByValArray, pero no con otros tipos. Para más detalles, mira el UnmanagedType enum.

Mi sospecha es que desea Marshall como un puntero C a la matriz:

[MarshalAs(UnmanagedType.LPArray)] 

Esto hará que se Marshall a través de una matriz estándar de C (BYTE *), por lo que sólo se pasa un puntero mediante. Hacer esto le permite pasar cualquier matriz de tamaño. Normalmente, también deseará pasar el tamaño de la matriz como otro parámetro (o ancho/alto/bpp de la imagen, que proporciona la misma información), ya que no hay forma de que C/C++ lo diga fácilmente.

+0

Gracias por la respuesta Reed. Sin embargo, lo hice y ahora sale este error no válida logró combinación/tipo no administrado (Arrays campos deben estar vinculados con ByValArray o SafeArray) Cuando la construcción de la IntPtr y luego Marshal.StructureToPtr ... Pensamientos? – Olewolfe

+0

Echa un vistazo a la enumeración. Se necesitaría más información. Asumía que manejabas desde manejado -> no administrado, pero si vas al revés, puedes Marhsal como IntPtr (en lugar de un byte []) o configurarlo para usar un SafeArray. –

+1

Desafortunadamente, el uso de todo menos [MarshalAs (UnmanagedType.ArrayByVal, sizeConst = xxxx)] confunde el direccionamiento de la memoria. Entonces, esencialmente, hay una estructura (que contiene un byte []) que debe convertirse en un IntPtr para que pueda pasar a la DLL. Y los datos en el byte [] se están arruinando. Verificó esto copiando los datos del IntPtr en un byte [] y mirando los datos para encontrar que todo ha cambiado a menos que haya configurado MarshalAs en la estructura. – Olewolfe