2009-08-06 42 views
7

Si dispone di una struttura che prende un array di byteMarshalling una dimensione sconosciuta array

byte[] 

tuttavia, la dimensione di tale matrice dipende l'immagine che si sta presentando (larghezzaxaltezza)

Allora ... come fai

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

È il SizeConst DEVE AVERE quando si lavora con array di byte che vengono passati da C# a C DLL?

+0

Un marshaller personalizzato sembra l'unica scelta. – IllidanS4

risposta

2

È necessario modificare il tipo di marshalling. SizeConst è richiesto se stai eseguendo il marshalling come ByValArray, ma non con altri tipi. Per i dettagli, guarda lo UnmanagedType enum.

mio sospetto è che si desidera marshall come un puntatore C all'array:

[MarshalAs(UnmanagedType.LPArray)] 

questo farà sì che a marshall attraverso uno standard serie C (BYTE *), così è passato solo un puntatore attraverso. In questo modo è possibile passare qualsiasi array di dimensioni. In genere, è anche necessario passare attraverso le dimensioni dell'array come un altro parametro (o larghezza/altezza/bpp dell'immagine, che fornisce le stesse informazioni), poiché in C/C++ non è possibile indicarlo facilmente.

+0

Grazie per la risposta Reed. Tuttavia, l'ho fatto e ora ricevo questo errore Combinazione di tipo gestito/non gestito non valido (i campi Array devono essere associati a ByValArray o SafeArray) Quando si crea l'IntPtr e poi Marshal.StructureToPtr ... Pensieri? – Olewolfe

+0

Controlla l'enum. Ci sarebbero più informazioni richieste. Stavo partendo dal presupposto che tu stavi effettuando il marshalling da gestito -> non gestito, ma se stai andando nella direzione opposta, puoi scegliere Marhsal come IntPtr (invece di un byte []) o configurarlo per utilizzare un SafeArray. –

+1

Sfortunatamente l'utilizzo di qualsiasi cosa tranne [MarshalAs (UnmanagedType.ArrayByVal, sizeConst = xxxx)] crea problemi nell'indirizzamento della memoria. Quindi in sostanza c'è una struct (che contiene un byte []) che deve essere convertita in un IntPtr in modo che possa essere passata alla DLL. E i dati nel byte [] si stanno incasinando. Verificato questo copiando i dati da IntPtr a un byte [] e guardando i dati per scoprire che tutto è cambiato a meno che non abbia impostato MarshalAs nella struttura. – Olewolfe

Problemi correlati